C++ 为什么程序会进入无限循环
我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于0的值,就可以了C++ 为什么程序会进入无限循环,c++,destructor,infinite-loop,C++,Destructor,Infinite Loop,我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于0的值,就可以了 #include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "constructor" << endl; } ~ClassA() { cout <
#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;
}
#包括
使用名称空间std;
甲级{
公众:
类别a(){
CUT< P> C++标准在第8章3.4中声明数组以的形式声明。
D1[常量表达式]属性说明符seq
…如果存在常数表达式(5.19),则应为
积分常数表达式及其值应大于零
换句话说,它们的大小不能是0。编译器允许您以任何方式为所概述的编程实践(可以说您不应该这样做)这样做
当你打破这样的规则时,接下来发生的任何事情都是未定义的行为——编译器可以做它想做的任何事情。这样做的原因是给编译器编写者一些编写编译器代码的余地,并允许进行一些优化。如果它在数组大小>0的情况下工作,那么问题出在哪里?这里的详细信息:零大小数组是某种未定义的行为,除了删除之外,您不应该使用指向它的指针。它在这里运行正常@tacp Ya,但它是未定义的行为。它可能在某些编译器的某个时间工作。它可能不会在另一个时间工作。@tacp当您使用未定义的行为时会发生这种情况。一个编译器生成工作代码,而其他编译器可能不会。