條款27 要求 禁止物件產生於heap中

2021-06-25 21:50:05 字數 783 閱讀 1473

1.要求物件產生於heap中

#includeusing namespace std;

class upnumber

當時這樣定義後,upnumber不能作為基類使用,如果要作為基類使用,可以把析構函式定義為protected;

2.判斷物件是否產生於heap上

作者介紹了幾種有bug或者不具有可移植性的解決方式;

①在類中增加靜態變數,標記是否呼叫operator new來分配記憶體;如果不是使用operator new來構造物件,就在建構函式中丟擲異常;

但問題在於這個標記不夠可靠;

②根據stack和heap的增長方向來判斷記憶體是否在heap中分配;

有兩個問題,一是不具有可移植性;二是區分不了heap和static;

③維護乙個集合,heap中分配的加入到這個集合中,delete的時候從這個集合中刪除,判斷乙個物件是否在heap中,就變成看這個物件的位址是否在集合中;

對於全域性的operator new和operator delete會有以下三個問題:一,改變原有的operator new和operator delete的語義;二,效率低;三,怎麼實現判斷乙個物件是否是在heap中;第三個問題是由於多重繼承和虛繼承(解決多重繼承時的二義性)導致的;

但是針對某個物件可以實現出operator new和operator delete以及isonheap;

3,禁止物件產生於heap中

直接在類中把operator new 和operator delete宣告為私有;

M27 要求或者禁止物件產生於heap之中

1 要求物件只能產生於heap之中,該怎麼辦?棧上的物件肯定呼叫構造方法和析構方法 離開作用域的時候 因此,要求物件只能產生於heap之中,也就是禁止棧上產生物件,解決辦法有兩種 將所有的構造方法宣告為private,或者將析構方法宣告為private。2 將所有的構造方法宣告為private,這樣...

條款27 盡量少做轉型動作

c 中的轉型語法包括舊式轉型和新式轉型。舊式轉換包括 t expression 將expression轉型為t,c風格的轉型動作 t expression 將expression轉型為t,函式風格的轉型動作 新式轉型包括 const cast expression const cast通常被用來將物...

條款27 盡量少做轉型動作

c 的設計目標之一是保證 型別錯誤 絕不會發生。但轉型 cast 破壞了型別系統 type system 舊式轉型,c風格的轉型動作,如下 t tmp 將tmp轉型為t t tmp 同上,函式風格的轉型動作 c 提供四種新式轉型 new style或c style casts 1 const cas...