c語言動態記憶體管理(malloc/calloc/realloc/free)
c++動態記憶體管理(new/delete/new/delete)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);
一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題。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申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。
在程式結束前可以用_crtdumpmemoryleaks();函式進行記憶體洩漏的檢測。記得加上標頭檔案crtdbg.h。使用f5檢視是否存在記憶體洩漏。上面**除錯後如下#include using namespace std;
class array
}~ array()
然後可以使用_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 標準庫...