Что именно здесь происходит?
#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 }
Проблема в том, что Toy() объекты передаются на boost::assign::list_of().Это временные объекты, которые создаются в стеке перед копированием в объект Box (который будет в куче)
Toy()
boost::assign::list_of()
Box
, чтобы избежать их создания в стеке, вы можете сделать это:1007 *
Переполнение стека происходит в конструкторе Box ().Я не уверен, как работает boost :: assign, но похоже, что вы передаете ему в качестве аргументов три временные переменные типа Toy.Построен, как они есть, в стеке.
Значение
boost::assign::list_of( Toy() )( Toy() )( Toy() )
создает (гигантский) временный стек (woo!), Который передается конструктору для игрушек.