相信一些朋友也碰見過這樣的面試題目,本文嘗試著給出解答.
1. 分配物件在堆上
那麼,必然要禁止物件在棧上面分配.乙個很簡單的辦法,就是建構函式私有化(提供額外的介面生成物件),那麼在棧上面就不可以分配.可是我們還需要這個物件要被析構,那麼可以提供乙個介面,顯式的釋放掉這個介面,也就是說delete也得給他禁掉~~~
考慮另外乙個問題,c++有placement new,我自己new一塊記憶體,然後在你這上面構造.問題就變得很噁心,看來我們只有把new,delete都給他禁掉...
好了,我們現在知道該怎麼做:
來看我們的**:
class heapobjectvoid dispose()
protected:
heapobject(){}
~heapobject(){}
static void* operator new (std::size_t size) throw (std::bad_alloc)
static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
static void* operator new (std::size_t size, void* ptr) throw();
static void* operator new (std::size_t size) throw (std::bad_alloc);
static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
static void* operator new (std::size_t size, void* ptr) throw();
static void operator delete (void* ptr) throw ()
static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
static void operator delete (void* ptr, void* voidptr2) throw();
static void operator delete (void* ptr) throw ();
static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
static void operator delete (void* ptr, void* voidptr2) throw();
};
2. 分配物件在棧上
只能分配物件在棧上面,那麼new顯然是不能用的,否則就是在堆上面分配物件了,理所當然,delete也得禁掉.
class stackobject~stackobject(){}
protected:
static void* operator new (std::size_t size) throw (std::bad_alloc);
static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
static void* operator new (std::size_t size, void* ptr) throw();
static void* operator new (std::size_t size) throw (std::bad_alloc);
static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
static void* operator new (std::size_t size, void* ptr) throw();
static void operator delete (void* ptr) throw ();
static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
static void operator delete (void* ptr, void* voidptr2) throw();
static void operator delete (void* ptr) throw ();
static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
static void operator delete (void* ptr, void* voidptr2) throw();
};
比較需要注意的地方是,new/delete有多個過載,算上的話,就是3*2*2=12個操作符.....
C 堆疊以及記憶體分配
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...
讓C 物件只能分配到堆 棧區的隨想
要把物件分配到棧上,需要使用到new operator,而new operator會呼叫operator new和placement new。根據侯捷先生的書所說,stl 書中的版本 對於某些物件做了統一的分配和統一的構造,而不把這兩個步驟通過直接呼叫new operator合二為一。實際上,pla...
C 如何只在堆 棧上建立類的物件
建構函式私有化 將類的建構函式私有,拷貝構造宣告成私有。防止別人呼叫拷貝在棧上生成物件。提供乙個靜態的成員函式,在該靜態成員函式中完成堆物件的建立。class heap only priivate c 98 類的構造和拷貝構造只宣告不定義a a const a c 11下的新寫法a delete a...