【问题标题】: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() )
        

        在堆栈(哇!)上生成一个(巨大的)临时对象,传递给玩具的构造函数。

        【讨论】:

          猜你喜欢
          • 2012-07-19
          • 2019-05-18
          • 1970-01-01
          • 2013-10-30
          • 2019-07-05
          • 1970-01-01
          • 2021-05-28
          • 2011-10-26
          • 2012-04-15
          相关资源
          最近更新 更多