删除指向分配的数组的指针new []
是"未定义的行为".我只是好奇为什么delete
下面代码中的第一个导致堆损坏如果定义了析构函数,否则没有任何反应(正如我谦卑地预期的那样).使用Visual Studio 8和GNU GCC 4.7.2版(http://www.compileonline.com/compile_cpp11_online.php)进行测试.
struct A { //~A() {} }; int main() { A* a = new A[10]; delete a; // heap corruption when the user destructor is defined int *b = new int[100]; delete b; // no heap corruption };
Lightness Ra.. 6
UB不是你可以在语言范围内合理化的东西,至少没有工具链,优化级别,操作系统,架构和处理器的详细知识.
但是,在猜测中:没有析构函数可以调用,编译器根本不会生成任何使代码的错误在现实世界中可见的代码.这样的析构函数调用可能会触及动态分配的内存块的标头,这在单个new A
示例中不存在.
不匹配new
,new[]
,delete
并且delete[]
是不确定的行为.真的,这是讨论的结束.
之后会发生任何事情.进一步分析是没有意义的.
UB不是你可以在语言范围内合理化的东西,至少没有工具链,优化级别,操作系统,架构和处理器的详细知识.
但是,在猜测中:没有析构函数可以调用,编译器根本不会生成任何使代码的错误在现实世界中可见的代码.这样的析构函数调用可能会触及动态分配的内存块的标头,这在单个new A
示例中不存在.