確保類總是動態地建立的一種辦法

2021-08-23 13:18:11 字數 1070 閱讀 3464

《more   effective   c++》   

條款27:   要求或禁止基於堆的物件   

有時你想這樣管理某些物件,要讓某種型別的物件能夠自我銷毀,也就是能夠「delete   this」。很明顯這種管理方式需要此型別物件被分配在堆中。而其它一些時候你想獲得一種保障:「不在堆中分配物件,從而保證某種型別的類不會發生記憶體洩漏。」如果你在嵌入式系統上工作,就有可能遇到這種情況,發生在嵌入式系統上的記憶體洩漏是極其嚴重的,其堆空間是非常珍貴的。有沒有可能編寫出**來要求或禁止在基於堆的物件(heap-based   object)呢?通常是可以的,不過這種**也會把「在堆中」的概念搞得比你腦海中所想的要模糊。   

要求基於堆的物件   

讓我們先從必須在堆中建立物件開始說起。為了執行這種限制,你必須找到一種方法禁止以呼叫「new」以外的其它手段建立物件。這很容易做到。非堆物件(non-heap   object)在定義它的地方被自動構造,在生存時間結束時自動被釋放,所以只要禁止使用隱式的建構函式和析構函式,就可以實現這種限制。   

把這些呼叫變得不合法的一種最直接的方法是把建構函式和析構函式宣告為private。這樣做***太大。沒有理由讓這兩個函式都是private。最好讓析構函式成為private,讓建構函式成為public。處理過程與條款26相似,你可以引進乙個專用的偽析構函式,用來訪問真正的析構函式。客戶端呼叫偽析構函式釋放他們建立的物件。   

例如,如果我們想僅僅在堆中建立代表無限精度數字的物件,可以這樣做:   

class   upnumber     

private:   

~upnumber();   

然後客戶端這樣進行程式設計:   

upnumber   n; //   錯誤!(在這裡合法,但是   

//   當它的析構函式被隱式地   

//   呼叫時,就不合法了)   

upnumber   *p   =   new   upnumber; //   正確   

delete   p; //   錯誤!試圖呼叫   

//   private   析構函式   

p->destroy(); //   正確   

將js裡的乙個陣列裡面的值動態地新增到乙個下拉框中

subcat 66 new array 蘇適 書法欣賞 蘇適 subcat 67 new array 劉藝 書法欣賞 劉藝 subcat 68 new array 愛新覺羅 啟驤 書法欣賞 愛新覺羅 啟驤 subcat 69 new array 苗培紅 書法欣賞 苗培紅 onecount 70 fu...

python 動態建立乙個類

class animal def eat self print eat class dog animal pass wangcai dog wangcai.eat 輸出 eat cat type cat animal,xiaohuamao cat xiaohuamao.eat 輸出 eat 元類就是...

C 動態建立類的例項

c 動態 建立類的例項,如果對效能要求不是很高,而且需要動態 建立類的例項的時候可以考慮使用以下的方法 1.定義兩個類 基類 public class basebusiness 子類 public class samplebusiness basebusiness 2.動態 建立類的例項 程式集名稱...