delete[]p和delete p的區別.md

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就會認爲指向的是單個對象,否則,它就會認爲指向的是一個數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章