1. 程式人生 > >動態內存管理——new和delete底層探索

動態內存管理——new和delete底層探索

new delete 動態內存管理

原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79824464
專欄鏈接:https://blog.csdn.net/column/details/20026.html
[TOC]
#1.new/delete 和operator new/operator delete和malloc/free的關系
先寫個栗子看看new和delete的用法:

int main()
{
    int *p0 = new int;
    int *p1 = new int(10);
    int *p2 = new int[10];
    int *p3 = (int *)malloc(sizeof(int)*10);

    delete p0;
    delete p1;
    delete[] p2;
    free(p3);
    return 0;
}

技術分享圖片
再看看他們之間的關系:
技術分享圖片

#2.new時底層處理的機制
技術分享圖片

#3.new/delete和malloc/free的區別
1)malloc/free是C/C++語言的標準庫函數,new/delete是C++的運算符

    malloc與free是C++/C 語言的標準庫函數,new/delete 是C++的運算符。對於非內部數據類的對象而言,光用maloc/free 無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數, 對象消亡之前要自動執行析構函數。由於malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加malloc/free。

2)用法上也有所不同。

函數malloc 的原型如下:
void malloc(size_t size);
● malloc 申請一塊長度為size 個字節
● malloc 返回值的類型是void
,所以在調用malloc 時要顯式地進行類型轉換,將void 轉換成所需要的指針類型。
● malloc 函數本身並不識別要申請的內存是什麽類型,它只關心內存的總字節數。
函數free 的原型如下:
void free( void
memblock );
● 如果p 是NULL 指針,那麽free對p 無論操作多少次都不會出問題。
● 如果p 不是NULL 指針,那麽free 對p連續操作兩次就會導致程序運行錯誤。

運算符new 使用起來要比函數malloc 簡單得多,例如:
int p1 = (int )malloc(size);
int *p2 = new int[size];
● new 內置了sizeof、類型轉換和類型安全檢查功能。
● 對於非內部數據類型的對象而言,new 在創建動態對象的同時完成了初始化工作。
● 如果對象有多個構造函數,那麽new 的語句也可以有多種形式。

在用delete 釋放對象數組時,留意不要丟了符號‘[]’。例如
● delete []p2; // 正確的用法
● delete p2; // 錯誤的用法
後者相當於delete p2[0],漏掉了另外size-1個對象。

說來說去我們要明白new的底層是調用malloc,delete底層調用的是free。在c++中我們使用時要明白二者的區別和聯系。在使用new時一定用delete釋放,用malloc時一定用free釋放,這樣匹配防止程序以外崩潰。

動態內存管理——new和delete底層探索