程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於在構造函數出現的異常

關於在構造函數出現的異常

編輯:關於C語言

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好的對象的內存釋放掉.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved