我正在尝试使用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”),但我遇到了同样的问题请帮忙!
答案 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 ++字符串。您应该至少使用正确的new
和delete
,以便调用构造函数。停止在C ++中使用C.
理想情况下,您甚至不会使用new
;只有一个具有自动存储持续时间的普通对象,或者,如果您迫切需要动态分配,std::make_unique
。
2016年无需手动内存管理。