我有一个非常简单的代码,包含2个结构和一个动态分配。程序在“nume”初始化时崩溃。
typedef struct{
int key;
string name;
} TElement;
typedef struct nod {
int cheie;
string nume;
struct nod *stg, *dr;
} NOD;
当我尝试这样做时
void ABC::inserare_element(TElement e){
NOD *p, *q;
int n;
/* construction nod p*/
n=sizeof (NOD);
p=(NOD*)malloc(n);
p->cheie = e.key;
p->nume = e.name; // on this line the program crashes
由于
答案 0 :(得分:7)
malloc()
不会调用NOD
的构造函数,这意味着nume
的构造函数将不会被调用,导致尝试在未构造/未初始化时使用std::string::operator=
std::string
:使用new
。
答案 1 :(得分:4)
这里有高级C ++对象的热门组合,例如std::string
和C样式的内存分配,例如malloc
。问题是C ++的new
运算符不仅分配内存,还调用高级对象的构造函数。您遇到的问题是类型nume
的{{1}}对象未正确初始化,因此您会遇到导致崩溃的未定义行为。那是因为你很幸运。如果程序实际工作,可能会更糟糕,但产生奇怪的,意外的结果。
要使其按预期工作,您只需使用std::string
代替new
即可。例如:
malloc
如果您确实需要使用p = new NOD;
或其他不关心C ++对象的内存管理API,那么您必须使用新的展示位置手动调用malloc
的构造函数。例如:
nume
如果你这样做 - 不要忘记调用析构函数,否则你最终会发生内存泄漏。
答案 2 :(得分:3)
你应该使用new而不是malloc。 malloc是一个C函数,它只分配一块内存。使用new将调用类的默认构造函数,此时也将调用字符串构造函数。