0

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

1 回答 1

0

C++ 标准在 §8.3.4 中声明数组的声明形式为

D1 [ 常量表达式 ] 属性说明符序列

...如果常量表达式 (5.19) 存在,它应该是一个整数常量表达式,并且它的值应该大于零。

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

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

于 2013-04-11T22:11:32.813 回答