首页 > 解决方案 > 如何修复由于在另一个类中使用类的对象而导致的动态分配内存的双重删除?

问题描述

我有以下代码,我在其中动态分配内存,然后在析构函数中将其删除两次,导致错误。我该如何解决这个问题?

(没有错,请参阅下面的编辑)。

class Song {
private:
    char *name;

public:
    Song (char *name = "") {
        this->name = new char[strlen(name)+1];
        this->name[strlen(name)] = '\0';
        strcpy(this->name, name);
    }
    ~Song() {
        cout << "DEST" << endl; // gets called 2 times, causing an error.
        delete [] this->name;
    }
};

class CD {
private:
    Song songs[1];

public:
    CD() {}

    ~CD() {}
};

int main() {
    CD cd1;
    
    Song song1("Song1");

    return 0;
}

编辑:看起来这段代码实际上没有任何问题。

问题出在我代码的另一部分:我使用了 = 运算符,但没有复制赋值构造函数。感谢您提供建议三规则的帮助。

标签: c++oop

解决方案


它不会两次删除您的 char 数组,它会创建您的类的两个实例,因此它为两个字符串分配内存,然后在析构函数中删除该内存。您的代码中没有任何双重释放,可能是您的问题的根源(但不应该使您的程序崩溃)是您将字符串分配给在 c++ 中已弃用的 char*,您应该改为使用构造函数原型中的 const char* Song (const char * name);


推荐阅读