C new 解析過載

2021-05-26 20:01:23 字數 1888 閱讀 1254

c++中new的總結

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用法之一 new運算子 最常用的是作為運算子的new,比如 string str new string test new 作為運算子,new和sizeof一樣,是c 內建的,你不能對它做任何的改變,除了使用它。new會在堆上分配一塊記憶體,並會自動呼叫類的建構函式。c new用法之二 ne...

關於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...