2

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

谢谢

4

3 回答 3

7

malloc()不会调用 的构造函数NOD,这意味着不会调用 的构造函数,nume从而导致尝试在未构造std::string::operator=/未初始化的std::string: 上使用new

于 2012-06-03T20:22:28.597 回答
4

这里有高级 C++ 对象的热门组合,例如std::stringC 风格的内存分配,例如malloc. 问题是 C++ 的new运算符不仅分配内存,还调用高级对象的构造函数。您面临的问题是nume类型对象std::string未正确初始化,因此您会遇到导致崩溃的未定义行为。那是因为你很幸运。如果程序确实在工作,但会产生奇怪的、意想不到的结果,情况可能会更糟。

为了让它像你想要的那样工作,你可以简单地使用new而不是malloc. 例如:

p = new NOD;

如果碰巧你真的需要使用malloc或其他不关心 C++ 对象的内存管理 API,那么你必须nume手动调用构造函数,使用放置 new。例如:

p = (NOD*)malloc(n);
new ((void *)&p->nume) std::string();

如果你这样做 - 不要忘记调用析构函数,否则你最终会出现内存泄漏。

于 2012-06-03T20:27:53.090 回答
3

您应该使用 new 而不是 malloc。malloc 是一个 C 函数,它只分配一块内存。使用 new 会调用你类的默认构造函数,此时也会调用字符串构造函数。

于 2012-06-03T20:26:01.333 回答