您好,登錄后才能下訂單哦!
原文鏈接: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釋放,這樣匹配防止程序以外崩潰。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。