2010-11-26 154 views
3

究竟發生了什麼?從堆分配時堆棧溢出

#include <boost/array.hpp> 
#include <boost/assign/list_of.hpp> 

struct Toy { 
    int m_data[100000]; 
}; 

struct Box { 
    Box() 
     : m_toys( boost::assign::list_of(Toy())(Toy())(Toy()) ) 
    {} 

    boost::array<Toy,3> m_toys; 
}; 

void main() 
{ 
    Box* box = new Box; // This causes stack overflow 
} 

回答

7

的問題是被傳遞給所述boost::assign::list_of()Toy()對象。這些是被複制到Box對象(這將是在堆)

,以避免在棧上創建它們之前在棧上創建的臨時對象,你可以這樣做:

Box() : m_toys() 
{ 
    Toy* t = new Toy; 
    for (int i = 0; i < 3; ++i) 
     m_toys.push_back(*t); 
    delete t; 
} 
+0

+1 for boost :: assign :: list_of。好點子! – 2010-11-26 14:34:55

1

的值

boost::assign::list_of(Toy())(Toy())(Toy()) 

在傳遞給玩具構造函數的堆棧(woo!)上生成一個(巨型)臨時值。

1

堆棧溢出發生在Box()構造函數中。我不確定boost :: assign工作如何,但它看起來像傳遞給它,作爲參數,三個類型爲Toy的臨時變量。按照原樣構建在堆棧上。