new和delete底层解析
new和delete底層解析
2018年04月05日 10:26:44?龍躍十二?閱讀數:205?標簽:?C++newdelete?更多
個人分類:?C++
所屬專欄:?C++
版權聲明:本文為博主原創文章,轉載請私信博主。 https://blog.csdn.net/qq_38646470/article/details/79824464
?
- 1.new/delete 和operator new/operator delete和malloc/free的關系
- 2.new時底層處理的機制
- 3.new/delete和malloc/free的區別
?
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; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
再看看他們之間的關系:?
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底层解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (*p)++和*(p++)和*p++的区
- 下一篇: 快速排序时间复杂度为O(n×log(n)