2010-11-26 118 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的临时变量。按照原样构建在堆栈上。