2016-03-04 258 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; 
}