shared_ptr вызывает segfault - PullRequest
       0

shared_ptr вызывает segfault

0 голосов
/ 22 января 2011

Я пытаюсь использовать 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
}

Ответы [ 4 ]

7 голосов
/ 22 января 2011

Вы не создали объект;subset2 - нулевой указатель.Вам необходимо создать объект для управления им:

std::shared_ptr<Dataset> subset2(new Dataset);
5 голосов
/ 07 ноября 2013

Для информации есть специальная функция для создания shared_ptr для нового выделенного объекта, в вашем случае:

std::make_shared<Dataset>()

Это вызовет конструктор Dataset().Если у вас есть второй конструктор, скажем, Dataset(int), вы можете написать std::make_shared<Dataset>(i) с целым числом i.

3 голосов
/ 22 января 2011

Ваш shared_ptr пуст. Он не хранит указатель на набор данных. Используйте, например,

 std::shared_ptr<Dataset> subset2(new Dataset) ;
1 голос
/ 22 января 2011

вы не создаете объект для переменной shared_ptr и не пытаетесь получить доступ к переменной-члену указателя.попробуйте

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