new、delete、malloc、free的關係:
delete會調用對象的析構函數,和new對應,free只會釋放內存,new調用構造函數。malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。
malloc使用:
int* p ;
p = (int*)malloc(sizeof(int)*128);
double* pd = (double*)malloc(sizeof(double)*10);
free使用:
free p;
free pd;
關於new/delete、malloc/free剛詳細的區別聯繫請看下面鏈接
https://blog.csdn.net/nie19940803/article/details/76358673
delete 和 delete[] 的區別:
delete只會調用一次析構函數,而delete[]會調用每個成員的析構函數。在More Effective C++中有更爲詳細的解釋:“當delete操作符用作於數組時,它爲每個數組元素調用析構函數,然後調用operator delete來釋放內存。”
delete與new配套,delete[] 與new[]配套。
實例如下:
#include <iostream>
using namespace std;
class Demo {
public:
~Demo()
{
cout << "析構函數" << endl;
}
};
int main()
{
Demo *pDemo = new Demo[10];
Demo *pDemo1 = new Demo;
int* pInt1 = new int[10];
int* pInt2 = new int;
delete []pDemo;
/*
輸出:
析構函數
析構函數
析構函數
析構函數
析構函數
析構函數
析構函數
析構函數
析構函數
析構函數
*/
delete pDemo1;
//輸出:析構函數
//delete []pDemo1; //不對,編譯能通過,但是運行會一直調用析構函數
//delete []pInt1;
delete pInt1; //正確:功能和delete []pInt1一樣
delete[]pInt2;
//delete pInt2; //正確:功能和delete []pInt2一樣
/*
對於內建簡單類型,delete p和delete []p功能是一樣的 ,因爲內建簡單類型沒有析構函數
但是對於自定義的複雜數據類型,就不能這樣了
*/
return 0;
}
這說明:對於內建簡單數據類型,delete[] 和delete功能是一樣的。對於自定義的複雜數據類型,delete和delete [] 不能互換。delete []刪除一個數組,delete刪除一個指針。簡單來說,new分配的內存用delete刪除,用new[]分配的內存用delete []刪除。delete[]會調用數組元素的析構函數。內部數據類型沒有析構函數,所以問題不大。如果你在用delete時沒用括號,delete就會認爲指向的是單個對象,否則,它就會認爲指向的是一個數組。