1:一個類在new過程中出現異常時,其所占內存會被delete掉(會調用operator delete函數)(這是編譯器的責任,我自己沒有干好的事,我就消毀,不給別人添加麻煩.).但其析構函數不會被調用.
2:一個類在new過程中沒有出現問題,那麼,delete的任務就交給程序員了.
3:new char[],int[]等方式取得的內存,也是,如果失敗返回null,資源被編譯器釋放,成功,則釋放的任務交給程序員了.所以說,一般都要檢查new的返回值是否為空.
所以假定在obj的構造函數與析構函數如下
obj()
{
pA = new A();
pB = new B();
pC = new C();
}
~obj()
{
delete pA; // :這裡為了簡便沒有作為空檢查.
delete pB;
delete pC;
}
如果在new C()時,發生異常,此時,new A,new B()已經正確的被new好了.編譯器會自己釋放 new C()的內存.
而new A(),new B()的內存原本是在 ~obj()被釋放的,現在obj()出現了異常,~obj()就會發生內存洩漏了.
一個比較好的解決方法是:
obj()
{
try{
pA = new A();
pB = new B();
pC = new C();
}
catch(...)
{
delete pA;
delete pB;
delete pC;
throw ; // 繼續傳遞異常.向上級告知.我這裡發生了異常.
}
}
這樣,無論哪個對象出現問題,都能保證已經new好的對象能被正解的釋放掉.(ps: 這也正是more effective C++ Item 10 的解釋之道.)
其思想是,如果出現了異常,我們的任務就是把那些new成功的內存如何釋放掉!!!
一般情況下就是,就把本層次內,也就是說本函數體內,所有new的內存,及本類內所有已經new好的對象的內存釋放掉.