2010-11-26 35 views
3

Que se passe-t-il exactement ici?Débordement de pile lors de l'allocation de tas

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

Répondre

7

Le problème est les objets Toy() étant passés à boost::assign::list_of(). Ce sont des objets temporaires qui sont créés sur la pile avant d'être copié à l'objet Box (qui sera sur le tas)

pour éviter de les créer sur la pile, vous pouvez le faire:

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

+1 pour boost :: assign :: list_of. bon point! –

1

Le la valeur

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

génère un temporaire (géant) sur la pile (woo!) qui est transmise au constructeur pour les jouets.

1

Le dépassement de pile se produit dans le constructeur Box(). Je ne sais pas comment boost :: assign work, mais on dirait que vous y passez, en arguments, trois variables temporaires de type Toy. Construit, comme ils sont, sur la pile.