C++ 为什么程序会进入无限循环

C++ 为什么程序会进入无限循环,c++,destructor,infinite-loop,C++,Destructor,Infinite Loop,我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于0的值,就可以了 #include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "constructor" << endl; } ~ClassA() { cout <

我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于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;
}
#包括
使用名称空间std;
甲级{
公众:
类别a(){

CUT< P> C++标准在第8章3.4中声明数组以

的形式声明。 D1[常量表达式]属性说明符seq

…如果存在常数表达式(5.19),则应为 积分常数表达式及其值应大于零

换句话说,它们的大小不能是0。编译器允许您以任何方式为所概述的编程实践(可以说您不应该这样做)这样做


当你打破这样的规则时,接下来发生的任何事情都是未定义的行为——编译器可以做它想做的任何事情。这样做的原因是给编译器编写者一些编写编译器代码的余地,并允许进行一些优化。

如果它在数组大小>0的情况下工作,那么问题出在哪里?这里的详细信息:零大小数组是某种未定义的行为,除了删除之外,您不应该使用指向它的指针。它在这里运行正常@tacp Ya,但它是未定义的行为。它可能在某些编译器的某个时间工作。它可能不会在另一个时间工作。@tacp当您使用未定义的行为时会发生这种情况。一个编译器生成工作代码,而其他编译器可能不会。