C ++动态分配程序崩溃

时间:2012-06-03 20:19:33

标签: c++ malloc

我有一个非常简单的代码,包含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

由于

3 个答案:

答案 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将调用类的默认构造函数,此时也将调用字符串构造函数。