考慮下面的代碼段創建的數組:刪除由新[]與刪除[]
#include <iostream>
#include <limits>
using namespace std;
struct my{
int a;
~my(){
cout << "d\n";
}
};
int main(){
my* a = new my[100];
// cout << (void*)a << " " << (void*)&(a[0]) << endl;
delete a; // I know I should use delete [],
// but just to find out what would happen if I do this.
}
的程序被打印d
然後給出段故障。 delete
的實現假定已經分配了大小爲sizeof(type)
的區域,並且必須釋放大量內存。 delete []
首先讀取已分配的元素數量。我發現大多數實現都在分配的內存的開頭存儲這個數字n
。 delete []
從開始取n
,並繼續釋放n * sizeof(type)
字節的分配內存。我不明白爲什麼上面的程序給段錯誤。我嘗試打印地址a
和&(a[0])
,它們完全相同,所以delete
試圖清除存儲區域的任何可能性都不正確。有人可以告訴發生了什麼事嗎?
注:當我們分配的基本類型的數組一樣int
這不會發生,double
等
它崩潰,因爲它是未定義的行爲。結束。 –
@SamVarshavchik爲什麼是UB?如果我們通過實施這些功能,應該清楚它爲什麼會發生。 – user3286661
'new'必須與'delete'匹配,'new []'***必須與'delete []'匹配。這就是C++語言規範所說的。還有什麼是錯的。 –