为什么程序进入无限循环

时间:2013-04-11 21:26:26

标签: c++ destructor infinite-loop

我有以下代码。它无限期地调用类的析构函数并崩溃。如果我将数组的大小更改为大于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;
}

1 个答案:

答案 0 :(得分:0)

C ++标准在§8.3.4中声明数组以

的形式声明
  

D1 [constant-expression] attribute-specifier-seq

     

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

换句话说,它们不能是0。编译器允许你这样做,无论如何都是为here概述的编程实践(你可以说不应该这样做)。

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