只能在堆上生成的物件 VS 只能在棧上生成的物件

2022-04-10 11:57:43 字數 863 閱讀 1523

1. 只能在堆上

即禁止在棧上生成。如何實現?

當物件建立在棧上面時,是由編譯器分配記憶體空間的,呼叫建構函式來構造棧物件。如果類的析構函式是私有的,則編譯器不會在空間上為類物件分配記憶體。

所以,只需把類的析構函式宣告為private即可禁止該類在棧上生成物件。但是別忘了提供乙個public的函式用於析構。

1

classa 4

void

destroy()

7private

:8 ~a(){}

9 };

缺點&follow up: 

2. 只能在棧上

即禁止在堆上生成。

只有使用new運算子,物件才會建立在堆上。因此,只要禁用new運算子就可以實現類物件只能建立在棧上。因此將運算子new和delete設為private即可。

1

class

a 4 ~a(){}

5private:6

void* operator

new(size_t size) {} //void*

7void operator

delete(void*ptr) {} //void

8 };

注意:new運算子的返回值型別是void* , delete的返回值型別是void。別弄錯了。

另外,new的引數是size_t, delete的引數是void*.

ref1: 

ref2: 

怎麼讓類只能在堆上生成例項

今天遇到乙個很有意思的面試題 面試官 怎麼讓類只能在堆上生成例項?我 把析構函式設為私有 原因如下 編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。當然,之後必...

只能在棧上或者堆上建立的物件

今天在這裡面看到了這個題目,據說還是google面試題。總的思想,是把一些在棧上或者堆上面建立物件,所必須的函式設為private使得編譯報錯。比如 只能在堆上建立,不能在棧上建立。因為棧上的物件,總是要呼叫析構函式。所以把析構函式設為private,然後new出來的物件,顯式的呼叫delete就可...

如何定乙個只能在堆上或者只能在棧上定義的類

c 中,物件的建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如 a ptr new a 靜態建立 由編譯器為物件在棧上分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件,使用這種方法,直接呼叫類的建構函式 動態建立 是通過new運算子將物...