C new 堆上和棧上分配物件

2021-06-26 07:20:27 字數 1316 閱讀 8810

1 說明

new:(1) 一種運算子(malloc是一種c中的庫函式)

(2) 先分配物件(operator new)再構造物件,一般用於滿足自定義的類型別

2 原型

原型: void * operator new(size_t) throw(bad_alloc)

解釋:該函式的返回值是乙個void*指標,同時有可能會丟擲bad_alloc的異常

3 分析

分析new,且看vs2010中預設的全域性operator new如下:

void *__crtdecl operator new(size_t size)  _throw1(_std bad_alloc)

return (p);

}

解釋:(1)函式框架與原型2一致

(2)3大步如下:

首先呼叫庫函式malloc函式分配記憶體,若分配成功則直接返回;

其次,若分配失敗則malloc返回0,此時呼叫new分配失敗的處理函式new_handler(可以自己設定),然後反覆malloc直到成功

最後,若呼叫new_handler後仍然無法分配足夠的記憶體,則丟擲bad_alloc異常

在operator new執行成功後,需要對物件進行構造,可以根據類型別以及給定的引數進行構造物件

4 placement new可在已經分配的記憶體上進行構造物件

new (已分配的位址) type

new (已分配的位址) type(引數)

5 僅在堆上才能建立的物件

利用棧變數在生命週期結束時由編譯器自動釋放的特點,即在生命週期結束時由編譯器自動呼叫析構函式,

通過將析構函式定義為private或者protected,使得編譯器無法呼叫,從而編譯不通過。

(1)初始如下

使用方法:

heapobject* hp = new heapobject;

hp->release();

缺點:不易用,使用new建立,但需要函式來釋放,且作為基類繼承後無法訪問private的析構函式

(2)修改如下

class heapobject

void release()

private:

~heapobject(){}

};

使用:heapobject* hp = heapobject::create();

hp->release();

6 僅能在棧上分配的物件

class stackobject

;

只在堆上或是棧上分配物件的方法

那麼如何限制類物件只能在堆或者棧上建立呢?下面分別進行討論。1 只能在堆上分配類物件,就是不能靜態建立類物件,即不能直接呼叫類的建構函式。容易想到將建構函式設為私有。在建構函式私有之後,無法在類外部呼叫建構函式來構造類物件,只能使用new運算子來建立物件。然而,前面已經說過,new運算子的執行過程分...

分配在堆上還是分配在棧上及其區別

1.問題情景 由c 的string的變數分配在堆上,而不是分配在棧上引起的內容回顧。注釋 c 的string型別是引用型別,不同於int,float等值型別。2.解析 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,記憶體的分配是連續的,類似於平時我們所說的棧,如果還...

物件只能建立在棧上(堆上)

只能建立在棧上 禁用new操作符,變數就只能定義在棧上了,new operator首先呼叫operator new,把operator new定義為private即可 class a void operator delete public a 只能建立在堆上 不能直接呼叫析構函式,那麼就無法在棧上建...