我正在尝试将字符串变量的值赋给结构的另一个字符串变量。但是gdb给出了运行时错误。错误如下: 程序接收信号SIGSEGV,分段故障。 std :: string :: assign中的0xb7f7c8f8(std :: string const&)() 来自/ usr / lib / i386-linux-gnu / libstdc ++。so.6
我的C ++程序是:
#include<iostream>
#include<stdlib.h>
#include<string>
typedef long unsigned int LUI;
using namespace std;
struct graph {
string string_node;
LUI node;
struct graph *link;
};
struct graph *abc[30];
struct graph *t;
string x;
int main() {
t = (struct graph *) malloc(sizeof(struct graph *));
x = "abc";
t->string_node = x;
t->link = NULL;
abc[0] = t;
cout << "Value is " << abc[0]->string_node << endl;
cout << "end";
return 0;
}
请帮我将x的值存储到t-&gt; string_node中。提前谢谢..
答案 0 :(得分:2)
t = (struct graph *) malloc(sizeof(struct graph *));
graph
是一个班级。它包含C ++类,特别是它包含std::string
。
必须使用new
运算符在动态范围内构造所有C ++类。它们不能用C库函数malloc()
构造,它对C ++类完全没有任何意义。这样做会导致未定义的行为(更不用说你的malloc-ed大小错了)。
现在您正在编写C ++代码,您需要完全忘记malloc()
,realloc()
和free()
曾经存在过,并始终使用new
和{{ 1}}。
答案 1 :(得分:1)
您的问题是,您使用struct
分配了malloc
,但struct
只有POD(普通旧数据)成员:它有一个{{ 1}}成员和std::string
个对象期望构造。简单地为std::string
分配内存不会调用malloc
构造函数,因此稍后尝试与std::string
进行交互将导致未定义的行为,因为该对象处于错误状态。 / p>
您应该使用std::string
来分配new
,这将正确分配内存和为每个成员调用默认构造函数。 (相反,您应该使用struct
而不是delete
释放该内存,以正确调用每个成员的析构函数。)
或者,可以使用"placement new
"在已经分配的内存中构造一个对象,但这不是您通常需要做的事情。