c 動態記憶體管理 new delete

2021-08-18 09:51:34 字數 1684 閱讀 6594

c語言是通過使用malloc、calloc、realloc、free進行記憶體管理

malloc:直接開闢空間

calloc:開闢空間時會進行初始化

realloc:它的函式原型為」void *realloc(void *ptr,size_t size)」,當引數 *ptr為空時,realloc等價於malloc;realloc可用於擴容,需要重新開空間。

c++中使用new、delete來動態管理物件

void test
new/delete和malloc/free要彼此對應使用,若亂用會造成記憶體洩漏;這兩組的區別在於:

1)malloc/free是c語言中的函式,而new/delete是c++中的操作符;

2)new/delete不需要標頭檔案支援,malloc/free需要;

3)它們都是動態記憶體管理的入口;

4)new建立的是乙個物件,通過成員函式訪問;malloc得到的是一塊記憶體,通過指標訪問;

5) malloc/free要手動計算型別大小且返回值是void*,new/delete可自己計算型別大小,返回對應型別的指標。

6)使用new時不僅是動態分配記憶體,還有呼叫建構函式進行初始化,delete不僅釋放記憶體還會呼叫析構函式進行成員清理;而malloc/free只是進行記憶體分配和釋放;

c++中還有如下的動態記憶體分配介面:

void * operator new (size_t size);

void operator delete (size_t size);

void * operator new (size_t size);

void operator delete (size_t size);

可以看出operator new/delete和new/delete的區別:前者是函式,後者只是操作符。

new操作符的執行過程是:

a)呼叫operator new分配空間;

b)呼叫建構函式初始化物件;

c)返回對應指標。

delete操作符的執行過程是:

a)呼叫operator delete釋放空間;

b)呼叫析構函式清理物件。

operator new/operator delete類似c語言中的malloc/free,只負責分配和釋放空間,不釣魚其他函式,但使用operator new分配的空間必須使用operator delete釋放。

operator new/operator delete和operator new/operator delete都可以過載,而new操作符不行。

operator new過載時返回型別要宣告為void*,第乙個引數型別是要分配空間的大小,且過載時可以帶其他引數。如果類中沒有過載operator new,就要呼叫的全域性的::operator new來完成堆的分配。

使用new分配陣列,如a *p4 = new a[3]; 會直接呼叫全域性的operator new(size_t size),不管a中是否有operator new的過載;而deletep卻會優先呼叫a::operator delete(如果a中有過載),

還需注意的是在operator new(size_t size)中傳入的並不是sizeof(a)*3,是要在物件陣列的大小上加上乙個資料大小,用於編譯器區分物件陣列指標和物件指標以及物件陣列大小,通常這個資料佔4個位元組,為乙個int大小。

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 用...