C C 動態記憶體管理

2021-08-24 18:06:08 字數 3175 閱讀 7883

記憶體分配的方式有3種:

1、從靜態儲存區域分配

內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如:全域性變數、static變數。

2、在棧上分配

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。效率很高,但是分配的記憶體容量有限,可能出現棧溢位。

3、從堆上分配(動態記憶體分配)

程式在執行時候用malloc()或new等申請任意的記憶體,程式設計師自己負責在何時用free()或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

c 動態記憶體管理

c語言使用malloc/calloc/realloc/free進行動態記憶體管理

malloc函式

void *malloc(size_t size);
功能:允許從空閒記憶體池中分配連續記憶體但不初始化。

引數:size引數是乙個所需位元組數的整數

返回:若分配成功則返回乙個指向該記憶體塊的指標,在使用時可根據需要做強制型別轉換,否則返回null(空指標)

calloc函式

void *calloc(size_t num, size_t size);
功能:同malloc,但作初始化。

引數:num是所需元素的數量,size是每個元素的位元組數。

返回:同malloc函式

realloc函式

void *realloc(void *ptr, size_t new_size);
功能:在指標ptr指向的記憶體基礎上擴大或縮小記憶體

引數:ptr是指向先前通過malloc、calloc、和realloc函式後分配的記憶體塊的指標,new_size是記憶體塊的新尺寸,可能大於或小於原有記憶體尺寸。

返回:若能調整記憶體大小,則返回指向調整後記憶體的指標,否則返回null。

realloc函式的使用注意點

free函式

void

free(void *ptr);

功能:釋放由指標ptr指向的動態分配的記憶體塊

注意

int *p1 = (int*)malloc(sizeof(int)* 4);

int *p2 = (int*)calloc(4, sizeof(int));

int *p3 = (int*)realloc(p2, sizeof(int)* 4);

c++動態記憶體管理

c++通過new和delete動態管理物件

有了malloc/free為什麼還要new/delete?

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

對於自定義型別而言,malloc()/free()無法滿足動態物件的要求:物件在建立的同時要自動呼叫建構函式,物件在銷毀時要自動呼叫析構函式。

因此,c++語言需要乙個能夠完成動態記憶體分配和初始化工作的運算子new,以及乙個能夠完成清理與釋放記憶體的運算子delete。

從記憶體池申請一些記憶體需要用new,它將根據你提供的資料型別分配一塊大小適當的記憶體。

如果有足夠的可用記憶體,new語句將返回新分配位址塊的起始位址。

如果沒有足夠的可用記憶體空間,就會丟擲std::bad_aloc異常。

注意:在用完記憶體塊之後,應該用delete語句釋放。另外附加一種保險的措施,在釋放了記憶體塊之後,還應該把與之關聯的指標設定為null。

用new運算子實現動態記憶體分配

int* p1 = new

int; // 動態分配 4 個位元組( 1 個 int)的空間單個資料

int* p2 = new

int(10); // 動態分配 4 個位元組( 1 個 int)的空間並初始化為 10

int* p3 = new

int[10]; // 動態分配 40 個位元組( 10 個 int)的空間

例:

class aa

~aa()

private:

int _a;

};

int main()

int main()

int main()

int main()

有關operator new/operator delete operator new/operator delete

總結:operator new/operator delete operator new/operator delete的用法和malloc/free一樣。

它們只負責分配空間/釋放空間,不會呼叫物件建構函式和析構函式來初始化/清理物件。

實際operator new/operator delete 只是malloc和free的一層封裝。

malloc()/free()和new/delete的區別和聯絡

常見的記憶體錯誤及避免

1、使用未分配成功的記憶體

2、引用分配成功但尚未初始化的記憶體

3、記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界

4、忘記釋放記憶體,造成記憶體洩露

5、釋放了記憶體卻繼續使用它

記憶體錯誤的注意點

野指標

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