C++动态分配程序崩溃

C++ dynamic allocation program crashes

本文关键字:崩溃 程序 动态分配 C++      更新时间:2023-10-16

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

谢谢

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

这里有

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

要使其按预期工作,您可以简单地使用 new 而不是 malloc .例如:

p = new NOD;

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

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

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

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