我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于0的值,则可以正常工作。
#include <iostream>
using namespace std;
class ClassA {
public:
ClassA() {
cout << "constructor" << endl;
}
~ClassA() {
cout << "destructor" << endl;
}
};
int main() {
ClassA *ptr;
cout << (void*) ptr << endl;
ptr = new ClassA[0];
cout << (void*) ptr << endl;
delete[] ptr;
cin.get();
return 0;
}
答案 0 :(得分:0)
C ++标准在§8.3.4中声明数组以
的形式声明D1 [constant-expression] attribute-specifier-seq
...如果存在常量表达式(5.19),则它应为a 积分常数表达式及其值应大于零。
换句话说,它们不能是0。编译器允许你这样做,无论如何都是为here概述的编程实践(你可以说不应该这样做)。
当您破坏这样的规则时,接下来发生的任何事情都是未定义的行为 - 编译器可以做任何想做的事情。这样做的原因是为编译器编写者提供了编译器代码的一些余地,并允许进行一些优化。