C 怎樣將C 物件分配在堆 棧上

2022-01-11 09:44:24 字數 2559 閱讀 6758

相信一些朋友也碰見過這樣的面試題目,本文嘗試著給出解答.

1. 分配物件在堆上

那麼,必然要禁止物件在棧上面分配.乙個很簡單的辦法,就是建構函式私有化(提供額外的介面生成物件),那麼在棧上面就不可以分配.可是我們還需要這個物件要被析構,那麼可以提供乙個介面,顯式的釋放掉這個介面,也就是說delete也得給他禁掉~~~

考慮另外乙個問題,c++有placement new,我自己new一塊記憶體,然後在你這上面構造.問題就變得很噁心,看來我們只有把new,delete都給他禁掉...

好了,我們現在知道該怎麼做:

來看我們的**:

class heapobject

void 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...