Переполнение стека при выделении из кучи - PullRequest
3 голосов
/ 26 ноября 2010

Что именно здесь происходит?

#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
}

Ответы [ 3 ]

7 голосов
/ 26 ноября 2010

Проблема в том, что Toy() объекты передаются на boost::assign::list_of().Это временные объекты, которые создаются в стеке перед копированием в объект Box (который будет в куче)

, чтобы избежать их создания в стеке, вы можете сделать это:1007 *

1 голос
/ 26 ноября 2010

Переполнение стека происходит в конструкторе Box ().Я не уверен, как работает boost :: assign, но похоже, что вы передаете ему в качестве аргументов три временные переменные типа Toy.Построен, как они есть, в стеке.

1 голос
/ 26 ноября 2010

Значение

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

создает (гигантский) временный стек (woo!), Который передается конструктору для игрушек.

...