2013-04-11 90 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編程實踐(你可以說是不應該這樣做),這樣做的反正。

當你違反這樣的規則時,接下來會發生的是未定義的行爲 - 編譯器可以做任何想做的事情。這樣做的原因是爲編譯器編寫者提供了編譯器編碼方式的一些餘地,並允許進行一些優化。