控制C++的类只能在堆分配或只能在栈分配
?
//HeapOnly.cpp??
? #include?? <iostream>??
? using?? namespace?? std;??
???
?
只能在堆上分配空間:我們可將類的析構函數用private來修飾,也就是把析構函數私有化,因為自動變量與靜態變量的對象都在釋放空間的時候都需要訪問析構函數。若析構函數私有,外面就不能調用,這時候會產生編譯錯誤,這樣就達到了只能在堆上分配空間了。但是,把析構函數私有化,那么我們就不能調用delete了, 因為它也需要訪問析構函數。這就要求我們自己去提供回收內存空間的函數,以防內存泄漏。
? class?? HeapOnly??
? {??
? public:??
? HeapOnly()?? {?? cout?? <<?? "constructor."?? <<?? endl;?? }??
? void?? destroy?? ()?? const?? {?? delete?? this;?? }??
? private:??
? ~HeapOnly()?? {}????
? };??
???
? int?? main()??
? {??
? HeapOnly?? *p?? =?? new?? HeapOnly;??
? p->destroy();??
? // HeapOnly?? h;??
? // h.Output();??
???
? return?? 0;??
? }??
? //StackOnly.cpp??
? //2005.07.18------2009.06.05??
? #include?? <iostream>??
? using?? namespace?? std;??
只能在棧上分配空間:可將 T:: operator new 全部私有,因為要在堆上分配空間,需要用到new來實現,當你把new私有化,我們就不能調用new T()這樣的語句,這樣可以達到只能在棧上來分配空間了。???
? class?? StackOnly??
? {??
? public:??
? StackOnly()?? {?? cout?? <<?? "constructor."?? <<?? endl;?? }??
? ~StackOnly()?? {?? cout?? <<?? "destructor."?? <<?? endl;?? }??
? private:??
? void*?? operator?? new?? (size_t);??
? };??
???
? int?? main()??
? {??
? StackOnly?? s;???????????????????????????????????????????????????????????? //okay??
? StackOnly?? *p?? =?? new?? StackOnly;?????????????????????????? //wrong??
???
? return?? 0;??
? }
?
在類設計中,類的成員如果是在棧中,那么也需要顯識地在類的析構函數中調用成員的析構函數,否則就會造成內存泄露
轉載于:https://www.cnblogs.com/cplover/p/3371946.html
總結
以上是生活随笔為你收集整理的控制C++的类只能在堆分配或只能在栈分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想当然是编程最大的坑,记更新删除过期co
- 下一篇: load-store/register-