Ошибка сегментации с общими указателями

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

Что не так с этим кодом (я свернул весь свой код)? Я не могу понять, почему pu.useIt(); возникает ошибка сегментации.

 #include <memory>

using namespace std;

class Person {
    private:
    shared_ptr<string> name;

    public:
    void setName(shared_ptr<string> name) {
        this->name = name;
    }

    shared_ptr<string> getName() {
        return name;
    }
};

class PersonCreator {
    shared_ptr<Person> person;

    public:
    void createAmy() {
        shared_ptr<string> amysName = make_shared<string>("amy");
        person->setName(amysName);
    }
};

class PersonUser {
    public:
    void useIt() {
        PersonCreator pc;
        pc.createAmy();
    }
};

int main()
{
    PersonUser pu;
    pu.useIt();

    return 0;
}
  

Ответ №1:

Вам нужно инициализировать person , теперь он пуст, ctor по умолчанию shared_ptr означает, что он указывает на nullptr:

 void createAmy() {
        shared_ptr<string> amysName = make_shared<string>("amy");
        person = std::make_shared<Person>();  // added
        person->setName(amysName);
    }
  

Комментарии:

1. default ctor of shared_ptr Вы получаете дополнительную информацию? Я получаю только код возврата 139

2. @Ben Я не понимаю, можете ли вы прояснить свой вопрос? Вы получили код выхода 139, потому что Person пользователь не указал на экземпляр, поэтому setName был вызван для указателя nullptr. После этого изменения ваше приложение все еще выходит из строя?

3. На самом деле моя минимизация неверна… Ваш ответ абсолютно правильный на мой вопрос.