C++中delete和delete[]的差別。本站提示廣大學習愛好者:(C++中delete和delete[]的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中delete和delete[]的差別正文
一向對C++中的delete和delete[]的差別不甚懂得,明天碰到了,上彀查了一下,得出了卻論。做個備份,以避免喪失。
C++告知我們在收受接管用 new 分派的單個對象的內存空間的時刻用 delete,收受接管用 new[] 分派的一組對象的內存空間的時刻用 delete[]。 關於 new[] 和 delete[],個中又分為兩種情形:(1) 為根本數據類型分派和收受接管空間;(2) 為自界說類型分派和收受接管空間。
請看上面的法式。
#include <iostream>; using namespace std; class T { public: T() { cout << "constructor" << endl; } ~T() { cout << "destructor" << endl; } }; int main() { const int NUM = 3; T* p1 = new T[NUM]; cout << hex << p1 << endl; // delete[] p1; delete p1; T* p2 = new T[NUM]; cout << p2 << endl; delete[] p2; }
年夜家可以本身運轉這個法式,看一看 delete p1 和 delete[] p1 的分歧成果,我就不在這裡貼運轉成果了。
從運轉成果中我們可以看出,delete p1 在收受接管空間的進程中,只要 p1[0] 這個對象挪用了析構函數,其它對象如 p1[1]、p1[2] 等都沒有挪用本身的析構函數,這就是成績的關鍵地點。假如用 delete[],則在收受接管空間之前一切對象都邑起首挪用本身的析構函數。 根本類型的對象沒有析構函數,所以收受接管根本類型構成的數組空間用 delete 和 delete[] 都是應當可以的;然則關於類對象數組,只能用 delete[]。關於 new 的單個對象,只能用 delete 不克不及用 delete[] 收受接管空間。 所以一個簡略的應用准繩就是:new 和 delete、new[] 和 delete[] 對應應用。
我的懂得,當用delete來釋放用new int[]請求的內存空間時,因為其為根本數據類型沒有析構函數,所以應用delete與delete []雷同,二者都邑釋放請求的內存空間,若是自界說的數據類型,有析構函數時,用new []請求的空間,必需要用delete []來釋放,由於要delete []時會一一挪用對象數組的析構函數,然後釋放空間,假如用delete,則只會挪用第一個對象的析構函數,前面對象的析構函數沒有被挪用,那末其空間能否釋放了呢??