windows 应用层编程基础试题

Q:频繁new和delete 会有什么影响?

 A:增加程序CPU开销,造成大量内存碎片,最终可能造成,内存不足,申请不到想要的空间大小。解决办法,使用内存池。

 

以下两种获取字符串方式,正不正确? 

//返回char*指针没有问题
char *GetString()
{
    char *p = new char[1024];
    ...
    return p;
}


//返回局部变量地址,出现意外错误
char *GetString()
{
    char szBuff[] = "hello world";
    char *p = szBuff;

    return p;
}

下面结构体大小是多少?

//该结构体大小为8字节。  因为有virtual 虚函数,结构体会多一个虚表指针,大小为4字节。加上成员变量int32_t 4字节,总共8字节。
class Test
{
public:
	Test():m_nNum(999) {};
	~Test() {};
	virtual void print6()
	{
		printf("6\r\n");
	}
	virtual int retint()
	{
		return 8;
	}
private:
	int32_t m_nNum;
}GTest;  



//该结构体大小为4字节,因为没有虚表指针,所以只计算成员变量大小(int32_t) 4字节。
class Test2
{
public:
	Test2():m_nNum(999) {};
	~Test2() {};
	void print6()
	{
		printf("6\r\n");
	}
	int retint()
	{
		return 8;
	}
private:
	int32_t m_nNum;
}GTest2;  

删除std::vector其中为1的元素. 需要注意 earse(ite) 后,返回值是下一个元素ite。

    //这么写会异常,因为erase后,该ite已经失效,再对期执行ite++操作,会抛异常。 erase的返回值是指向下一个元素的ite.
	std::vector test = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
	for (std::vector::iterator ite = test.begin(); ite != test.end(); ite++)
	{
		int32_t i = *ite;
		if (i == 1)
		{
			test.erase(ite);
		}
	}
	




    //正确删除方法
    std::vector test = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
	for (std::vector::iterator ite = test.begin(); ite != test.end();)
	{
		int32_t i = *ite;
		if (i == 1)
		{
			ite = test.erase(ite);//删除后该ite失效,erase返回下一个元素的iterator,更新ite的值,否则再对已经失效的ite进行操作,会异常 
		}
		else
		{
			ite++;
		}
	}

多线程同步:

  互斥体和事件对象

//创建自动处理信号的事件对象,间第二个Wait会不会走下去?
HANDLE h1 = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h1, INFINITE); //该wait不会走下去。因为第一个wait完成后,h1自动被设为无信号,如果想要使其有信号,必须调用SetEvent(h1);



//互斥体做线程同步,请问第二个wait会不会走下去?
HANDLE h2 = CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(h2, INFINITE);
WaitForSingleObject(h2, INFINITE); //第二个wait会走下去,因为创建开始当前线程拥有h2的执行权,当前线程没有调用 ReleaseMutex(h2)释放其拥有权,其他线程就不会拿到h2的拥有权。而且Mutex没有自动释放拥有权的机制。必须调用ReleaseMutex(HANDLE),或者拥有h2所有权的线程执行完 才会释放.


 

你可能感兴趣的:(面试题)