2010-11-26 2 views
3

여기서 정확히 무엇이 일어나고 있습니까?힙에서 할당하는 동안 스택 오버플로가 발생합니다.

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

답변

7

문제는 boost::assign::list_of()에 전달되는 Toy() 개체이다. 이들은

스택에 그들을 만드는 피하기 위해 (힙에있을 것입니다)를 Box 개체로 복사되기 전에 스택에 생성되는 임시 객체가, 당신이 할 수 있습니다 :

Box() : m_toys() 
{ 
    Toy* t = new Toy; 
    for (int i = 0; i < 3; ++i) 
     m_toys.push_back(*t); 
    delete t; 
} 
+0

+1 : boost :: assign :: list_of. 좋은 지적! –

1

은 장난감의 생성자에 전달되는 임시 스택 (우연히도)을 생성합니다.

1

Box 오버플로가 발생했습니다() 생성자. 나는 boost :: assign work가 어떻게 작동하는지 모르겠다.하지만 당신이 그것을 인자로 전달하는 것처럼 보인다. Toy의 세 가지 임시 변수. 그들은 그대로 스택에 구성됩니다.

관련 문제