C C 動態記憶體管理詳解

2021-10-08 18:49:14 字數 3604 閱讀 5112

c++中的記憶體操作關鍵字

總結c語言中可以使用malloc、calloc、realloc來開闢堆區記憶體,使用free來釋放堆區記憶體

c++中用new來開闢堆區記憶體,在堆區開闢的資料需要程式設計師手動釋放,用delete來釋放

void

* malloc (size_t size)

;

這個函式可以用來向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標

使用示例:

// malloc了一塊大小為乙個整型的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p1接收

int* p1 =

(int*)

malloc

(sizeof

(int))

;// malloc了一塊大小為8個整型的空間,將其void*的返回值強轉為char*,賦給char*型別的變數p2接收

char

* p2 =

(char*)

malloc

(sizeof

(int)*

8);

void

* calloc (size_t num, size_t size)

;

如果對申請的記憶體空間的內容要求初始化,那麼可以很方便的使用calloc函式來完成任務

使用示例:

// calloc了6塊大小為乙個整型的空間,共6個位元組,將其全部初始化為0,並將其void*的返回值強轉為int*,賦給int*型別的變數p3

int* p3 =

(int*)

calloc(6

,sizeof

(int))

;// calloc了8塊大小為5個整型的空間,共40個位元組,將其全部初始化為0,並將其void*的返回值強轉為char*,賦給char*型別的變數p4

char

* p4 =

(char*)

calloc(5

,sizeof

(int)*

8);

realloc函式的出現讓動態記憶體管理更加靈活

有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了。為了合理的使用記憶體,我們一定會對記憶體的大小做靈活的調整。realloc 函式就可以做到對動態開闢記憶體大小的調整

void

* realloc (

void

* ptr, size_t size)

;

realloc在調整記憶體空間時存在4種情況:

調整之後的記憶體 < 原空間大小:原空間尾部的記憶體被拿掉,只剩餘調整之後的大小,內容只保留調整之後的部分

調整之後的記憶體 = 原空間大小:原空間大小和其中的內容不發生改變

調整之後的記憶體 > 原空間大小,且原空間後面有足夠的連續空間:在原空間後面開闢新增的空間大小

調整之後的記憶體 > 原空間大小,且原空間後面沒有足夠的連續空間:重新開闢一塊調整之後大小的連續空間,把原空間的資料拷進去

因為realloc在申請對空間對原空間進行擴容時,可能存在後面沒有足夠連續空間的情況,因此使用方法和前面幾個有所區別:

// malloc了一塊大小為20位元組的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p5

int* p5 =

(int*)

malloc(20

);// 將p5的記憶體擴大到1000位元組

p5 =

(int*)

realloc

(p5,

1000);

// 上面這段**看似沒有什麼問題,其實不然;若原來的p5空間後面沒有連續的980位元組供realloc擴容

// 則realloc會在記憶體中重新尋找一塊1000位元組的連續空間,把原空間的資料拷進去,再把新空間的名字改為p5

// 此時原空間的資料沒有釋放掉,若不小心對這段空間進行訪問,就會發生意想不到的情況

// 正確的用法是這樣的:

// malloc了一塊大小為20位元組的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p6

int* p6 =

(int*)

malloc(20

);int* p7 =

null

;// 將p6的記憶體擴大到1000位元組,並賦給p7

p7 =

(int*)

realloc

(p6,

1000);

if(p7 !=

null

)

void free (

void

* ptr)

;

free函式用來釋放動態開闢的記憶體,動態開闢的空間一定要釋放,並且正確釋放。

double

* p =

(double*)

malloc

(sizeof

(int)*

40);free

(p);

申請和釋放單個元素的空間,使用new和delete操作符;申請和釋放連續的空間,使用new[ ]和delete[ ]

語法:new 資料型別

利用new建立的資料,會返回該資料對應的型別的指標

// 動態申請乙個int型別的空間

int* ptr4 =

newint

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

int* ptr5 =

newint(10

);// 動態申請10個int型別的空間

int* ptr6 =

newint[3

];

delete的使用方法:

int

* ptr4 =

newint

;int

* ptr5 =

newint(10

);int* ptr6 =

newint[3

];delete ptr4;

delete ptr5;

delete

ptr6;

其實,c++中的new和delete關鍵字在底層仍是由malloc和free通過operator過載實現的

malloc/free

new/delete

malloc/free是函式

new/delete是運算子

malloc可以按位元組申請,得到的指標無型別,使用時一般需要強轉

new在申請時就寫明了型別,得到的指標有型別,不需要強轉

malloc申請失敗時,返回null,因此需要判空

new申請空間失敗時,拋異常

申請自定義型別空間時,malloc/free不會呼叫構造/析構函式

申請自定義型別空間時,new/delete會呼叫構造/析構函式進行初始化和清理工作

使用malloc申請的記憶體,理論上可用delete釋放,但可讀性很差,因此需要配對使用

使用new申請的記憶體,若使用free釋放可能會因無法執行析構函式而出錯

C C 動態記憶體管理

一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...

C C 動態記憶體管理

注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...

C C 動態記憶體管理

c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...