C C 記憶體管理 new和delete

2021-09-27 08:30:49 字數 2267 閱讀 1757

c 語言中的動態記憶體管理方式有malloc、calloc、realloc 和 free,但是 malloc 和 free 是函式,new 和 delete 是 c++ 用於管理堆記憶體的兩個運算子

1.內建型別操作

void

test1()

;//動態申請10個int型別的空間。並初始化為

delete p1;

delete p2;

delete[

] p3;

delete[

] p4;

}

如果new和delete沒有匹配使用,產生後果?

void

test2()

結論:如果申請的是內建型別的空間,不會產生任何後果

2.自定義型別操作

class test

~test()

private:

int _data;

int* _p;};

void

test3()

new的原理

呼叫operator new函式申請空間,operator new函式實際通過malloc來申請空間,空間申請成功直接返回,申請失敗時檢測是否有空間不足應對措施,有則繼續申請,沒有就丟擲異常。

在申請的空間上呼叫建構函式,完成物件的構造

delete的原理

在空間上呼叫析構函式,完成物件中資源的清理工作

呼叫operator delete函式釋放物件的空間,operator delete函式本質是通過free來釋放空間的。

new t[n]的原理

呼叫operator new函式,在operator new中實際呼叫operator new函式,而operator new函式實際通過malloc迴圈申請空間,完成n個物件空間的申請。

在申請的空間上呼叫n次建構函式。

delete[ ]的原理

在釋放的物件空間上呼叫n次析構函式,完成n個物件中資源的清理。

呼叫==operator delete==釋放空間,實際在operator delete[ ]中呼叫operator delete,而operator delete函式實際通過free來釋放空間。

如果new和delete沒有匹配使用,產生後果?

void

test4()

結論:不管是new還是delete,只要涉及到[ ],必然會崩潰。

含義:定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。

使用格式:new (place_address) type或者new (place_address) type(initializer-list)

place_address必須是乙個指標,initializer-list是型別的初始化列表。

使用場景:定位new表示式在實際中一般是配合記憶體池使用。因為記憶體池分配出的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用new的定義表示式進行顯示調建構函式進行初始化。

void

test6()

malloc/free和new/delete的相同和不同

malloc/free和new/delete的共同點是:都是從堆上申請空間,並且需要使用者手動釋放。

不同的地方是:

malloc和free是函式,new和delete是操作符。

malloc申請的空間不會初始化,new可以初始化。

malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可。

malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別。

malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常。

申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理。

malloc申請的空間一定在堆上,但new不一定。

記憶體管理 new

作用域 作用的範圍 a.普通區域性變數 include intmain int argc,char ar 內部定義的變數就是區域性變數 只有執行到定義變數的這個語句,系統才會給這個變數分配空間 當離開 這個非static區域性自動釋放 區域性變數的作用域在當前的 離開此 無法使用此變數 的普通區域性...

C 記憶體管理new和operator new

在c 中我們知道函式可以進行過載,而一些操作符也是可以過載的。比如new和delete操作符。我們知道new和delete是c 中負責申請記憶體空間和釋放空間的。針對與系統內建型別的變數的使用和操作就不過多介紹。今天看看針對於某個物件的使用。先給出乙個簡單的test類 class test test...

C C 記憶體分配和管理

malloc 申請指定位元組數的記憶體。申請到的記憶體中的初始值不確定。calloc 為指定長度的物件,分配能容納其指定個數的記憶體。申請到的記憶體的每一位 bit 都初始化為 0。realloc 更改以前分配的記憶體長度 增加或減少 當增加長度時,可能需將以前分配區的內容移到另乙個足夠大的區域,而...