C++提供了強大的異常處理機制,但有時候使用不當會引發一些問題,看如下代碼。
#include <iostream>
using namespace std;
class A
{
public:
A()
{
p = new int;
throw -1;
}
~A()
{
delete p;
}
private:
int *p;
};
int main()
{
while(true)
{
try
{
A a;
}
catch(...)
{
continue;
}
}
}
類A的構造函數中new了一個int,我們在類A的析構函數中也delete了。正常情況下不會發生什麼問題,但如果在構造函數中new了以後,構造函數還沒有執行完,後面的代碼拋出了異常,而我們在外部捕獲了異常並處理異常。這樣,A類對象a並沒有構造出來,析構函數也不會執行,便造成了內存泄露。運行上面這個循環的程序,你會發現內存佔用越來越大。所以在實際編寫代碼的時候,儘量不要在構造函數中做過多操作,構造函數僅僅用於初始化成員變量,如成員變量清零,成員指針清零等操作。看一下很多類庫、框架源碼,都會發現他們在類的構造函數中都是隻放了幾小條初始化成員變量的代碼。假如構造函數中的代碼會產生異常應當在構造函數中處理異常,釋放已經new出來的內存。