2011-01-21 129 views
0

我想用我的類的shared_ptr,但由於某種原因,我得到段錯誤。也許我在做一些愚蠢的事情。shared_ptr導致段錯誤

#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()構造。如果你有第二個構造函數,比如Dataset(int),你可以寫一個整數i的std::make_shared<Dataset>(i)