2011-01-21 2 views
0

J'essaie d'utiliser shared_ptr avec ma classe mais pour une raison quelconque, je reçois segfault. Peut-être que je fais quelque chose de stupide.shared_ptr provoquant segfault

#include <tr1/memory> 
#include <iostream> 
class Dataset ; 
typedef int DataClass; 
class Dataset_Impl{ 
    friend class Dataset ; 
    DataClass *dc; 
    Dataset_Impl(){dc = new DataClass[10];} 
    public: 
    void getSubset(Dataset_Impl* &dObj){ 
     dObj = new Dataset_Impl(); //Causing segfault when using shared_ptr 
     /*copy subset of 'dc' to dObj->dc and return*/std::cout<<"Copied subset"; 
    } 
}; 
class Dataset{ 
    Dataset_Impl *d; 
    public: 
     Dataset(){}; 
     inline void const getSubset(Dataset &dObj) const{d->getSubset(dObj.d);} 
}; 
int main(){ 
    Dataset m1,subset1;std::shared_ptr<Dataset> subset2; 
    m1.getSubset(subset1); 
    m1.getSubset((*subset2)); //Causing segfault 
} 

Répondre

7

Vous n'avez pas créé d'objet; subset2 est un pointeur nul. Vous devez créer un objet pour qu'il gère:

std::shared_ptr<Dataset> subset2(new Dataset); 
1

vous n'êtes pas en train de créer un objet pour la variable shared_ptr et en essayant d'accéder à une variable de membre du pointeur. essayez

std::shared_ptr<Dataset> subset2(new Dataset()) 
3

Votre shared_ptr est vide. Il ne stocke pas de pointeur sur un dataset. Utilisez par ex.

std::shared_ptr<Dataset> subset2(new Dataset) ; 
5

Pour plus d'informations, il est une fonction dédiée à créer un shared_ptr sur un nouvel objet alloué, dans votre cas:

std::make_shared<Dataset>() 

Ceci appellera Dataset() constructeur. Si vous avez un second constructeur, disons Dataset(int), vous pouvez écrire std::make_shared<Dataset>(i) avec un entier i.