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<int32_t>其中爲1的元素. 需要注意 earse(ite) 後,返回值是下一個元素ite。

    //這麼寫會異常,因爲erase後,該ite已經失效,再對期執行ite++操作,會拋異常。 erase的返回值是指向下一個元素的ite.
	std::vector<int32_t> 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<int32_t>::iterator ite = test.begin(); ite != test.end(); ite++)
	{
		int32_t i = *ite;
		if (i == 1)
		{
			test.erase(ite);
		}
	}
	




    //正確刪除方法
    std::vector<int32_t> 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<int32_t>::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所有權的線程執行完 纔會釋放.


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章