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

时间:2016-07-16 20:34:07

标签: c++ pointers memory allocation assign

我正在尝试使用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-&gt; data =“string”),但我遇到了同样的问题请帮忙!

2 个答案:

答案 0 :(得分:5)

使用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将对象初始化为有效状态(online demo)。

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

答案 1 :(得分:5)

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

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

2016年无需手动内存管理。