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 只能建立在堆上 不能直接呼叫析構函式,那麼就無法在棧上建...