2011-01-21 38 views
0

私は自分のクラスでshared_ptrを使用しようとしていますが、何らかの理由でsegfaultを取得します。たぶん私は何か愚かなことをやっているかもしれない。shared_ptr 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 
} 

答えて

7

オブジェクトを作成していません。 subset2はヌルポインタです。

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

shared_ptr変数のオブジェクトを作成していて、ポインタのメンバー変数にアクセスしようとしていません。試してみてください

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

あなたのshared_ptrは空です。データセットへのポインタは格納されません。 詳細について

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

あなたのケースでは、新たに割り当てられたオブジェクトにshared_ptrを作成するための専用の機能があります:

std::make_shared<Dataset>() 

これはDataset()コンストラクタを呼び出します。 2番目のコンストラクタがある場合は、Dataset(int)としましょう。std::make_shared<Dataset>(i)を整数iで書くことができます。

関連する問題