Ошибка сегментации по поводу умных указателей c ++? - PullRequest
0 голосов
/ 26 марта 2019

Здравствуйте, я новичок в C ++. И сегодня, когда я тестировал проект своего кода, я столкнулся с проблемой, которая заставила меня запутаться.

Я хочу использовать умный указатель в моем проекте синтаксического анализа JSON, поэтому я передаю строку класса: json_content и хочу, чтобы член json_content, json_value получил строку. Компилятор не дал мне ни предупреждения, ни ошибки, но когда я запускаю файл a.out, он сообщает, что segmentation fault. Я много искал в Google, но не нашел решения этой проблемы. Кто-нибудь может мне помочь? Большое спасибо! :)

Кстати, моя ОС MacOSX x86_64-apple-darwin18.2.0, компилятор Apple LLVM version 10.0.0 (clang-1000.10.44.4)

Вот код:

#include <string>
#include <iostream>
#include <memory>
#include <typeinfo>
using namespace std;

class json_content {
    public:
    string json_value;
};

int main()
{
    shared_ptr<json_content> c;
    shared_ptr<string> p2(new string("this is good"));

    // segmentation fault
    c->json_value = *p2;
    // this is also bad line!
    c->json_value = "not good, too!";

    return 0;
}

1 Ответ

4 голосов
/ 26 марта 2019

По умолчанию shared_ptr равно nullptr (см. API ). Вы не можете отменить ссылку nullptr. Сначала нужно инициализировать c:

#include <string>
#include <iostream>
#include <memory>
#include <typeinfo>

using namespace std;

class JsonContent {
 public:
  string json_value;
};

int main() {
  shared_ptr<JsonContent> c = std::make_shared<JsonContent>();
  shared_ptr<string> p2 = std::make_shared<string>("This is good.");

  c->json_value = *p2;
  c->json_value = "This is also good!";
  cout << c->json_value << endl;
  return 0;
}

Демо : http://cpp.sh/5fps7n.

...