关于 C++ 智能指针的分段错误?
Segmentation fault about c++ smart pointers?
您好,我是 C++ 的新手。而今天在测试自己代码的项目时,遇到了一个让我感到困惑的问题。
我想在我的解析项目JSON中使用智能指针,所以我将一行字符串传递给class:json_content
,我想要[的成员=11=], json_value
获取字符串。编译器没有给我任何警告或错误,但是当我 运行 a.out 文件时,它告诉我 segmentation fault
。我在 Google 中搜索了很多,但是我没有找到解决这个问题的方法。任何人都可以帮助我吗?非常感谢! :)
顺便说一句,我的 OS 是 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;
}
默认情况下,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;
}
您好,我是 C++ 的新手。而今天在测试自己代码的项目时,遇到了一个让我感到困惑的问题。
我想在我的解析项目JSON中使用智能指针,所以我将一行字符串传递给class:json_content
,我想要[的成员=11=], json_value
获取字符串。编译器没有给我任何警告或错误,但是当我 运行 a.out 文件时,它告诉我 segmentation fault
。我在 Google 中搜索了很多,但是我没有找到解决这个问题的方法。任何人都可以帮助我吗?非常感谢! :)
顺便说一句,我的 OS 是 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;
}
默认情况下,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;
}