2016-03-04 259 views
0

以下代碼會導致Visual Studio 2015致命錯誤C1060:編譯器超出了堆空間。 如果我使用64位版本的編譯器它爲此示例吃了超過25G的ram。 Visual Studio 2012和2010工作正常。這是一個編譯器錯誤?Visual Studio 2015編譯器錯誤C1060

class Test 
{ 
public: 

    Test() : 
     m_val1(0), 
     m_val2(0) 
    { 
    } 

    Test(Test *val1) : 
     m_val1(val1), 
     m_val2(0) 
    { 
    } 

    Test(Test *val1, Test *val2) : 
     m_val1(val1), 
     m_val2(val2) 
    { 
    } 

    ~Test() 
    { 
     if (m_val1) 
      delete m_val1; 
     if (m_val2) 
      delete m_val2; 
    } 

private: 
    Test* m_val1; 
    Test* m_val2; 
}; 

int main() 
{ 
    Test t(new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(
     new Test(new Test(new Test), 
       new Test(new Test(new Test(new Test(new Test(new Test(), 
                   new Test()), 
                new Test(new Test(), 
                new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(new Test(), 
                                       new Test()))))))))))) 
     ))))))))))))))); 

    return 0; 
} 
+9

這可能是一個編譯器問題,但是你的代碼是非常不尋常的,沒有人會爲真正的項目編寫代碼。 –

+1

順便說一句,刪除空指針是安全的;測試是多餘的。 –

+2

如果有人和我一起工作寫這樣的代碼,它不會是我在質疑的編譯器;-) –

回答

0

這是一個錯誤。最小代碼如下。

如果函數的數量足夠小,編譯器會發出兩個警告:main::A a(...prototyped function not called (was a variable definition intended?)'a': unreferenced local variable;否則,在我的電腦上,它會掛起。

如果用花括號代替括號,爲了消除歧義,一切都很好。

int main() 
{ 
    class A {}; 
    A a(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A()))))))))))))))))))))))); 
    // fine: A a{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{ A{} } } } } } } } } } } } } } } } } } } } } } } }; 

    return 0; 
}