c++ - 如何修复由于在另一个类中使用类的对象而导致的动态分配内存的双重删除?
问题描述
我有以下代码,我在其中动态分配内存,然后在析构函数中将其删除两次,导致错误。我该如何解决这个问题?
(没有错,请参阅下面的编辑)。
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;
}
编辑:看起来这段代码实际上没有任何问题。
问题出在我代码的另一部分:我使用了 = 运算符,但没有复制赋值构造函数。感谢您提供建议三规则的帮助。
解决方案
它不会两次删除您的 char 数组,它会创建您的类的两个实例,因此它为两个字符串分配内存,然后在析构函数中删除该内存。您的代码中没有任何双重释放,可能是您的问题的根源(但不应该使您的程序崩溃)是您将字符串分配给在 c++ 中已弃用的 char*,您应该改为使用构造函数原型中的 const char*
Song (const char * name);
推荐阅读
- linux-kernel - 使用 I2C 开发驱动程序
- jsf - 不匹配的结束标签
- sql - 是否可以在 PostgreSQL 中创建可为空的外键约束?
- php - Laravel中具有关系的种子数据
- visual-studio-2017 - VS 2017 15.7.2 Manage Nuget Package报错“Visual Studio组件缓存已过期请重启Visual Studio”
- getorgchart - JSON 使用 getorgchart 创建树
- angular - ng2-ckeditor 工具栏无法正常工作
- symfony - 在请求期间检索实体而不是持久化它
- database - 保存在数据库中时所有时区的 Laravel 时间延迟
- rxjs - 切换到新的 observable,将上一个 observable 中的最新作为输入