C++:分段错误(核心转储)在 linux OS

C++ : Segmentation fault (core dumped) On linux OS

我正在尝试使用 g++ 5.1 编译和执行这个小的 c++ 代码,它编译得很好,当我在 linux 上执行它时,我收到此错误消息:“Segmentation fault (core dumped)”。

但是相同的代码 运行 在 osx 上正确但在 linux 上不正确:

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

struct node {
 std::string data;
};

int main() {
  struct node * node = (struct node * )
  malloc(sizeof(struct node));

  node->data.assign("string");
  // node->data = "string" --> same issue

  return 0;
}

我尝试了一个简单的 assigne (node->data = "string"),但我遇到了同样的问题 请任何帮助!

使用 C++ 时忘记 malloc()。如果你想分配一个对象使用 new:

node * n = new node;   // or if your variable should be called node 
                       // you'd need new struct node to disambiguate

malloc() 的问题是它只分配未初始化的内存。它不确保对象创建的 C++ 语义。因此,节点内的字符串未初始化为有效状态。这导致此字符串的赋值是 UB。

如果您真的需要在 C++ 中使用 malloc(),则需要使用 placement new afterwards to initialize the object to a valid state (online demo)。

 void *p = malloc(sizeof(node));   // not so a good idea ! 
 node *n2 = new (p)node;           // but ok, it's feasible. 

您不能 malloc C++ 字符串。您至少应该使用正确的 newdelete,以便调用构造函数。停止在 C++ 中使用 C。

理想情况下你甚至不会使用 new;只需要一个具有自动存储持续时间的普通对象,或者,如果您迫切需要动态分配,std::make_unique.

2016年不需要手动内存管理