記憶體分配的方式有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...