規則一、
如果存在發生異常退出的風險,並且在其他位置沒有對已分配堆的物件的引用,則指向該物件、具有本地作用域的指標必須被推入清除棧。
void doexamplel()
這個例項看上去好像沒有什麼問題,可以如果在new或者呼叫dosomethingl()的時候出現異常退出,那麼指標超出作用域,現在沒有辦法釋放這個堆物件,於是發生記憶體洩漏,解決辦法就是後面所講的分段構造。
規則二、
絕對不要將例項資料(類物件擁有的資料)推入到清除棧。
類物件的資料是類物件進行管理,例項資料的清除應該在析構函式中進行。如果把例項資料推入道清除棧中,會造成重複刪除。
規則三、
建構函式和析構函式絕對不能異常退出,並且析構函式不能採取完全構造。
這句話我始終沒有理解透,原文不知道怎麼寫的,不過翻譯版本就這樣。我想可能是想說對於複雜類物件進行例項化,不能採取在建構函式裡面進行完全構造,應該分兩段構造。
第一段:改造建構函式,使其不做構造。
celementsengine::celementsengline(cconsolebase& aconsole):iconsole(aconsole)
第二段:這裡才做真正的構造
void celementsengline::constructl()
通常我們提供乙個靜態的newl()函式來完成構造,而把建構函式和constructl()定義為私有的或受限的(好的程式設計習慣)。
celementsengine* celementsengine::newl(cconsolebase& aconsole)
如此,複雜物件在構造的時候,應該不會出現什麼記憶體溢位的問題了。這個地方多說一句,在壓棧的時候pushl()也可能發生異常,因為它必須把記憶體分配給新的棧單元。實際上,它有乙個"備用"棧單元,在分配新的棧單元前就將壓入的指標賦值給這個單元,即使分配新的棧單元失敗,也可以保證在後面清除它。
我們在例項**中常常看到newlc()這個方法,那為什麼有了newl()方法了,還要有newlc()這個方法呢?這個c在這裡代表什麼意思呢?
我們可以想象一下,假如現在我們通過newl()方法正確構造了乙個celementsengine*例項self,這個時候我們又需要呼叫它的乙個方法self->dosomethingl(),而dosomethingl()方法並非安全函式,絕對有可能錯誤退出,而此時self已經沒有處於清潔棧裡面了,此時就會無法清除self所指向的物件而造成記憶體溢位。c在這裡的意思是當前在清除棧上放置了乙個指向它所返回物件的指標。我們來看看newlc()的具體實現:
celementsengine* celementsengine::newlc(cconsolebase& aconsole)
大家可以看到,它與我們上面的newl()方法只有一行相差,那就是沒有從棧裡彈出(cleanupstack::pop(self)),那麼我們在呼叫self->dosomethingl()的時候,即使錯誤退出,也可以清除它。
既然如此,我們可以把newl()方法加以改造:
celementsengine* celementsengine::newl(cconsolebase& aconsole)
讓newlc()為我們例項化,然後加上pop(self)就能達到我們的要求了。
規則四、
刪除成員指標後,總是在重新分配前將其初始化為0。
假如類裡面有乙個元素為hbufc描述符得iname,修改iname的函式如下:
void cchemicalelement::setnamel(const tdesc& aname)
假如我們把方法裡面的iname=null;遮蔽掉,那麼我們來分析一下執行的步驟:
1、刪除舊名字
2、重新分配值
而allocl()並非乙個安全函式,如果異常退出,則將銷毀cchemicalelement例項,而它的析構函式將嘗試刪除iname,而iname已經在前面delete,如果不顯式的設定為null,它將繼續指向已經被釋放的舊iname,如果便造成了重複刪除iname的錯誤。如果我們在前面顯式的設定為null,當allocl()錯誤退出,cchemicalelement的析構函式會嘗試刪除iname,而此時iname=null,即delete null;將不會做任何操作。這樣便防止了重複刪除錯誤的發生
應用程式開發步驟
c 是一種編譯語言,c 源程式需要經過編譯 連線,生成可執行檔案後方可執行。使用c 開發乙個應用程式大致要經過以下步驟 1 首先要根據實際問題確定程式設計的思路,包括選用適當的數學模型。這方面的內容其實也是各應用學科的主要研究領域之一。2 根據前述思路或數學模型編寫程式。除了非常簡單的問題可以直接寫...
maximo應用程式開發
單頁面程式 1 開發完後要授權,在安全組裡面,授權完後點應用,儲存。然後退出,重新登入 2 若要對查詢結果做出條件限制則在表屬性 高階 應用程式限制裡寫where語句 比如要限制某查詢非空,則用 is not null 工作流 1 節點屬性 指定角色和應用 許可權體系 若新建使用者時出現無法傳送郵件...
c 應用程式開發
與access建立聯絡 oledb c access 讀寫資料庫 c 連線access資料庫及增刪改查操作 c 讀取資料庫有多少條資料 c int轉成string,string轉成int 1,int轉成string 用tostring 或者convert.tostring 如下 例如 int var...