c++ new用法之一 new運算子
最常用的是作為運算子的new,比如:
string *str = new string(「test new」);
作為運算子,new和sizeof一樣,是c++內建的,你不能對它做任何的改變,除了使用它。
new會在堆上分配一塊記憶體,並會自動呼叫類的建構函式。
c++ new用法之二 new函式
第二種就是new函式,其實new運算子內部分配記憶體使用的就是new函式,原型是:
void *operator new(size_t size);
new函式返回的是乙個void指標,一塊未經初始化的記憶體。如你所見,這和c語言的malloc行為相似,你可以過載new函式,並且增加額外的引數,但是必須保證第乙個引數必須是size_t型別,它指明了分配記憶體塊的大小,c++允許你這麼做,當然一般情況下這是不必要的。如果過載了new函式,在使用new操作符時呼叫的就是你過載後的new函式了。
如果使用new函式,和語句string *str = new string(「test new」)相對的**大概是如下的樣子:
string *str
= (string*)operator new(sizeof(string));
str.string(「test new」);
// 當然這個呼叫時非法的,但是編譯器是沒有這個限制的
這還不算完,還有第三種的new存在。
c++ new用法之三 placement new
第三種,placement new,這也是new作為函式的一種用法,它允許你在一塊已存在的記憶體上分配乙個物件,而記憶體上的資料不會被覆蓋或者被你主動改寫,placement new同樣由new操作符呼叫,呼叫格式是:
new (buffer) type(size_t size);
先看看下面的**:
char str[22];
int data
= 123
; int *pa
= new
(&data) int;
int *pb
= new
(str) int(9);
結果*pa = 123(未覆蓋原資料),而*pb = 9(覆蓋原資料),可以看到placement new 並沒有分配新的記憶體,也可以使用在棧上分配的記憶體,而不限於堆。
為了使用placement new 你必須包含或者
其實placement new和第二種一樣,只不過多了引數,是函式new的過載,語法格式為:
void *operator new(size_t, void* buffer);
它看起來可能是這個樣子:
void *operator new(size_t, void* buffer)
和new對應的就是delete了,需要**記憶體啊,不然就洩漏了,這個下次再寫吧,回憶一下今天的內容先。
總結
1. 函式new
void *operator new(size_t size); 在堆上分配一塊記憶體,和placement new(void *operator new(size_t, void* buffer)); 在一塊已經存在的記憶體上建立物件,如果你已經有一塊記憶體,placement new會非常有用,事實上,它stl中有著廣泛的使用。
2. 運算子new
最常用的new,沒什麼可說的。
3. 函式new不會自動呼叫類的建構函式,因為它對分配的記憶體型別一無所知;而運算子new會自動呼叫類的建構函式。
4. 函式new允許過載,而運算子new不能被過載。
5. 緊接著就是對應的delete。
C new 解析過載
c 中new的總結 c new用法之一 new運算子 最常用的是作為運算子的new,比如 string str new string test new 作為運算子,new和sizeof一樣,是c 內建的,你不能對它做任何的改變,除了使用它。new會在堆上分配一塊記憶體,並會自動呼叫類的建構函式。c ...
關於c new操作符的過載
關於c new操作符的過載 你知道c 的new 操作符和operator new 的區別麼?也許你還會問,他們有區別嗎?當你寫下面這樣的 時,string pa new string memory managerment 你使用的是new 操作符,這個操作符和sizeof 一樣,是c 語言級別支援的...
C new 的六種過載形式
當寫出p new p 這樣的 的時候,實際上有兩步操作,首先分配記憶體,然後在分配好的記憶體之上初始化類成員.第 二步是有建構函式完成的,第一步就是new函式的工 作.全域性的new有六種過載形式,void operator new std size t count throw std bad al...