C C 動態記憶體管理

2021-08-03 13:16:20 字數 1985 閱讀 4431

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, sizeof(int)*2);//當p1位空時,相當於malloc

free(p2);

free(p3);

c++動態記憶體管理(new/delete/new/delete)

int* p1 = new int;

int* p2 = new int(3);//動態分配並初始化

int* p3 = new int[3];//動態分配陣列

delete p1;

delete p2;

delete p3;

一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題。

記憶體管理

1. 棧又叫堆疊,非靜態區域性變數/函式引數/返回值等,在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。

2. 記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。

3. 堆用於程式執行時動態記憶體分配,堆是向上增長的。

4. 資料段-儲存全域性變數和靜態變數。在以前的 

c 語言中,全域性變數又分為初始化的和未初始化的(初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數與靜態變數在相鄰的另一塊區域,同時未被初始化的物件儲存區可以通過 

void* 

來訪問和操縱,程式結束後由系統自行釋放),在 

c++ 

裡面沒有這個區分了,他們共同占用同一塊記憶體區。

5. **段-可執行的**(命令)/唯讀常量。

深入理解c++動態記憶體管理

本質:

malloc/free是c/c++語言的

標準庫函式

,new/delete是c++的

運算子。

對於使用者自定義的物件而言,用maloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。(自定義型別呼叫,內建型別不呼叫)

malloc/free需要手動計算型別大小且返回值會void*。new/delete可自己計算型別的大小,返回對應型別的指標,並且失敗是拋異常。

聯絡:既然new/delete的功能完全覆蓋了malloc/free,為什麼c++還保留malloc/free呢?因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。

#include using namespace std;

class array

}~ array()

在程式結束前可以用_crtdumpmemoryleaks();函式進行記憶體洩漏的檢測。記得加上標頭檔案crtdbg.h。使用f5檢視是否存在記憶體洩漏。上面**除錯後如下

然後可以使用_crtsetbreakalloc(67);函式(在程式開始)進行記憶體洩漏的定位。

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 動態記憶體管理

目錄 總結並剖析malloc free和new delete之間的關係和差異。剖析new delete和new delete做了什麼?實現new array delete array巨集,模擬實現new delete申請和釋放陣列 它們都是動態管理記憶體的入口。malloc free是c c 標準庫...