【问题标题】:Stack overflow while allocating from heap从堆分配时堆栈溢出
【发布时间】:2011-05-16 05:21:44
【问题描述】:
这里到底发生了什么?
#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
}
【问题讨论】:
标签:
c++
boost
stack
overflow
【解决方案1】:
问题是Toy() 对象被传递给boost::assign::list_of()。这些是在被复制到Box 对象(将在堆上)之前在堆栈上创建的临时对象
为避免在堆栈上创建它们,您可以这样做:
Box() : m_toys()
{
Toy* t = new Toy;
for (int i = 0; i < 3; ++i)
m_toys.push_back(*t);
delete t;
}
【解决方案2】:
堆栈溢出发生在 Box() 构造函数中。我不确定 boost::assign 是如何工作的,但看起来你正在将三个 Toy 类型的临时变量作为参数传递给它。按原样在堆栈上构造。
【解决方案3】:
价值
boost::assign::list_of( Toy() )( Toy() )( Toy() )
在堆栈(哇!)上生成一个(巨大的)临时对象,传递给玩具的构造函数。