有時候,指明一些特定類的物件不應該被分配到堆(heap)上是個好主意,這類物件有:
1、維護本體物件的引用計數的控制代碼物件。
2、具有自動儲存區的類的區域性物件,此類物件希望得到的效果是析構函式自動呼叫。
禁止使用堆分配方法之一是將其記憶體分配定義為不合法:
class noheap
void operator delete(void *) {}
privaete:
void * operator new(size_t);
void operator delete(void *);
}之所以要給出 new 和 delete 的定義,是因為一些平台上它們可能會被建構函式和析構函式隱式地呼叫,又因為他們可能被派生類的構造與析構函式隱式呼叫,所以宣告為 protected。
同時也要注意阻止在堆上分配陣列,所以只要將 array new 和 array delete 宣告為private並且不給予定義就可以了。
當我們鼓勵使用堆分配的時候,只需把析構函式宣告為 private 就可以了:
class on
heap
// ... }
C 必知必會
條款2 多型 2 條款3 設計模式 5 條款4 stl 8 條款5 引用是別名而非指標 10 條款6 陣列形參 13 條款7 常量指標與指向常量的指標 16 條款8 指向指標的指標 19 條款9 新式轉型操作符 21 條款10 常量成員函式的含義 25 條款11 編譯器會在類中放東西 29 條款12...
C 必知必會 placement new
placement new placement new 是過載operator new的乙個標準 全域性的版本,它不能被自定義的版本代替 不像普通的operator new和operator delete能夠被替換成使用者自定義的版本 它的原型如下 void operator new size t,...
C 必知必會(4)
直接呼叫建構函式是行不通的,然而可以通過使用placement new來哄騙編譯器呼叫建構函式 void operatornew size t,void p throw placement new是operator new的乙個標準的過載版本,也位於全域性名字空間中,但和我們通常看到的operato...