从堆分配时堆栈溢出

zer*_*s00 3 c++ stack boost overflow

到底发生了什么?

#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
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*cio 7

问题是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;
}
Run Code Online (Sandbox Code Playgroud)