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