C 動態記憶體管理 new和delete

2021-09-12 09:54:58 字數 1950 閱讀 7381

c++中使用new(分配)和delete(釋放)來管理在堆(也叫自由空間)的記憶體

它們的底層封裝了c語言中的malloc和free函式

new和delete、malloc必須配套使用,不能交叉使用,原因:如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,結果也會導致程式出錯,但是該程式的可讀性很差。

(1)malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

(2)對於非內部資料型別的物件而言,光用malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

(3)new可以認為是malloc加建構函式的執行。new出來的指標是直接帶型別資訊的,返回的是指向物件的指標。而malloc返回的都是void指標

原因:c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。

括號包圍的初始化器的特殊:可以使用auto從()或{}中的值來判斷我們想要分配的物件的值,不過只能是單一初始化器(即()或{}只能是乙個值)

auto p1=new auto(obj);       //p指向乙個與obj型別相同的物件

auto p2=new auto; //錯誤

動態物件的生存期直到被顯式delete為止

(1)返回指向動態記憶體的指標有很大風險,如下:

//返回指向動態記憶體的指標(非智慧型指標),呼叫者必須記得釋放記憶體

foo* factory(t arg)

void use_factory(t arg)

//此示例中呼叫者忘記釋放記憶體,造成記憶體洩漏

(2)delete之後重置指標值為nullptr避免空懸指標的方法:在delete之後,將指標值賦為nullptr不過以上方法還是存在危險,如下:

//可能有多個指標指向相同的記憶體,在delete其中乙個指標後,記憶體被釋放,重置指標只對當前指標有效,對任何其他指標無效

int *p(new int(42));

auto q=p;

delete p;

p=nullptr; //p不再指向任何物件,但是q仍指向原位址,變得無效

//可以如下改進,但在實際中,查詢指向相同記憶體的所有指標是困難的

q=nullptr;

見我的另一篇部落格:

(1)忘記delete記憶體

(2)使用已經釋放掉的物件

(3)同一塊記憶體釋放兩次

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...

c 動態記憶體管理

c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...