考虑以下代码:
#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
试图清除存储n
的区域的任何可能性都不正确。有人可以告诉你发生了什么事吗?
注意:当我们分配基本类型的数组时,例如int
,double
等,就不会发生这种情况。
答案 0 :(得分:2)
对delete
获取的指针使用new[]
的行为是 undefined 。 (当您编写delete
)时,某些C ++运行时库的实现方式使得普通旧数据类型的数组正确delete
。
真的没有别的可说。
答案 1 :(得分:1)
new
分配的内容必须由delete
释放,new[]
必须由delete[]
释放。
new
用于分配,而将其他API与Windows GlobalFree()
混合使用。正确删除a:
delete[] a;
delete
,则会产生undefined behaviour