【问题标题】:Segmentation fault when changing `std::string` in by pointer通过指针更改“std::string”时出现分段错误
【发布时间】:2014-05-01 02:25:17
【问题描述】:

我有一个std::string* 作为我班级的成员,但是当我尝试将其值设置为类构造函数中的任何内容时,我得到了segmentation fault (core dumped)

相关代码部分:

// class declaration:
//...
std::string* _sensorString;
//...


// on class constructor
//...
std::cout << "test "<< std::endl;
*_sensorString="s";
std::cout << *_sensorString<< std::endl;
//...

程序的输出:

test 
Segmentation fault (core dumped)

【问题讨论】:

  • 在您将“s”分配给它之前,_sensorString 是否指向任何东西?
  • 按如下方式启动 gdb:gdb core.(无论核心编号如何)并输入命令:where,它应该会引导您了解段错误发生的位置。

标签: c++ string pointers c++11


【解决方案1】:

你没有为对象分配内存,

std::string* _sensorString;

你应该写

_sensorString = new std::string;

写之前

*_sensorString="s";

【讨论】:

  • 几乎没有理由这样做。您通常使用 std::string 因为您根本不想使用指针。
  • @PMF 我不明白你为什么在我的回答中写了这个评论。您可以在自己的答案中执行此操作。您也可以询问线程的作者使用指针的原因是什么。也许他只是学习 C++。
  • 我可以问,我同意。但从上下文来看,我认为 OP 确实是 st​​l 的初学者,所以你的答案(虽然显然是正确的)指向了错误的方向 IMO。
  • @PMF 请下次不要评论我的答案。如果您知道正确的方向,那么只需在您自己的答案中描述它。
  • 对现有答案发表评论是完全合理的,尤其是当评论与@PMF 一样有用且正确时。
【解决方案2】:

是的,很明显。 std::string* 是一个指针,当指针没有被初始化的时候给指针赋值会导致分段错误。标准模板库可以帮助您使用 objects,因此您不需要指针。只需将您的类型声明为

 std::string _sensorString;

那么你就可以把它当做

 _sensorString = "s";

【讨论】:

  • 我使用它作为在不同线程之间共享字符串的一种方式。显然两种方式都有效,我只是在试验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多