首先先看下圖了解程式是怎樣在記憶體中管理的:
1.棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。
2.記憶體對映段是高效的1o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。
3.堆用於程式執行時動態記憶體分配,堆是可以上增長的
4.資料段一儲存全域性資料和靜態資料。
5.**段可執行的**唯讀常量。
在c語言中我們動態分配記憶體使用malloc/free;在c++中沒有直接使用這種函式,而是使用new / delete 、new / delete
它們都是動態管理記憶體的入口,malloc / free是cc++標準庫的函式,new/ delete是c++操作符。
為什麼c++要使用new / delete 而不使用malloc/free?
因為 malloc / free只是動態分配記憶體空間釋放空間。而new/ delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理成員),而且malloc/frec需要手動計算型別大小且返回值會void", new / delete可自己計算型別的大小,返回對應型別的指標。
下面剖析
new / delete 、new / delete是如何動態分配記憶體的:
●new做了兩件事1.呼叫 operator new分配空間。2.呼叫建構函式初始化物件。 ●
delete也做了兩件事呼叫析構函式清理物件2.呼叫 operator delete釋放空
●new[n]1.呼叫 operator new分配空間2.呼叫n次建構函式分別初始化每個物件。 ●
delete[n]1.呼叫n次析構函式清理物件。(思考這裡怎麼n是怎麼來的2.呼叫 operator delete釋放空間。
new在給內建型別開闢空間時,開闢的空間不會多4個位元組,而new在給自定義型別開闢空間時,而且還看是否有自定義析構函式,如果定義了析構函式才會多開闢四個位元組,用來判斷這裡要呼叫多少次析構函式;如果沒有自定義析構函式,就不會多開闢四個位元組了
下面是模擬new / delete 、new / delete是如何動態分配記憶體
#includeusing namespace std;
class a
~a()
private:
int _a;
};int main()
// deletep
int j = 0;
for (j = 0; j < *((int*)pb-1); j++) //顯式呼叫析構函式,通過*((int*)pb-1)可以判斷呼叫多少次析構函式
operator delete((int*)pb-1); //釋放所以開闢的空間
*/ a* p4 = new a[3];
delete p4;
return 0;
}
c 動態記憶體管理深入理解
c 的動態記憶體管理 c語言用3個函式進行動態記憶體分配。malloc申請一段連續的堆空間並返回首位址,不能初始化記憶體空間。calloc會將分配到的空間每一位初始化為0,因此效率稍低。realloc給乙個已經分配了位址的指標重新分配空間,realloc 擴大空間時,很有可能原有空間後的餘留空間不夠...
C 動態記憶體管理
我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...
C 動態記憶體管理
1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...