2013-04-11 89 views
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; 
} 
+1

如果它适用于数组大小> 0,那么问题是什么? – foo64 2013-04-11 21:30:08

+4

详细信息:http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory零大小的数组有点不确定的行为,你不应该使用它的指针,除了删除。 – 2013-04-11 21:30:13

+0

它在这里运行正常http://liveworkspace.org/code/2xF98s$0 – taocp 2013-04-11 21:30:36

回答

0

的C++中§8.3.4标准规定阵列形式

D1 [常数表达式]属性说明符-SEQ

声明...如果恒定 - 表达式(5.19)存在时,它应该是一个 积分常量表达式,其值应大于零。

换句话说,他们不能成为大小为0编译器允许您为概述here编程实践(你可以说是不应该这样做),这样做的反正。

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