C 必知必會 禁止或強制使用堆分配

2021-05-25 07:15:58 字數 575 閱讀 4110

有時候,指明一些特定類的物件不應該被分配到堆(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...