C 如何只在堆上或者棧上生成物件

2021-07-22 11:17:01 字數 740 閱讀 9895

這個是個面試題,不知道的時候確實會一比較懵;那麼具體如何實現呢?

棧和堆這兩種記憶體的使用想象大家都了解吧,棧一般是靜態建立乙個物件的時候會有編譯器自動建立,而堆是需要呼叫new來達到目的的。

首先若是不能呼叫new,那麼就無法在堆上生成物件了,那麼...

class c

~c()

private:

void* operator new(size_t);

void operator delete(void *);

};void test3()

只在棧上生成物件是解決了,那麼要想只在堆上生成物件的話,意思就是只能通過new來生成物件了。我們可以將析構函式設定為私有的,這樣類外使用靜態方法建立物件的時候就會報錯,這樣可以達到目的,於此同時需要自己提供乙個介面,用於釋放物件。

但是我們知道私有函式在繼承的時候是無法直接在派生類中直接呼叫的(而且在delete的時候會呼叫析構函式,這個時候也是不行的...),那麼這樣的話我們就考慮到了將析構函式設定為保護的,因為保護屬性是轉為繼承而生的,這樣就可以解決上述問題而且滿足要求。

class b

void destroy()

protected:

b()~b() };

void test2()

這裡我將建構函式設定為保護成員了,然後通過靜態成員函式來完成物件的構造,通過專門的成員函式釋放物件。

只在堆或棧上生成物件

一般情況下,編寫乙個類,是可以在棧或者堆分配空間。但有些時候,你想編寫乙個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。在c 中,類的物件建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如a ptr new a 這兩種方式是有區別的。1 靜態建立類物件 是...

C 如何限制物件在堆上或棧上生成

1,限制類的物件只能生成在棧上 將 operator new 各種原型設為私有 include class onlyonstack onlyonstack private void operator new std size t size void operator new std size t s...

C 如何限制物件在堆上或棧上生成

1,限制類的物件只能生成在棧上 將 operator new 各種原型設為私有 include class onlyonstack onlyonstack private void operator new std size t size void operator new std size t s...