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所有權的線程執行完 纔會釋放.