我有以下代码。我的程序有一个基类,即 c1 。 c2 和 c3 是其派生类。我还有一个名为 FilmDB (数据库)的类,它将我的所有电影存储在一个数组中,名称为电影。在这些if语句中,我将电影放入这个数组中,具体取决于它的类型。 (测试条件)。它工作正常,但 f , cs , d 永远不会免费,内存泄漏就会出现。问题是我不能在if语句中使用delete [],因为我的程序崩溃,但我不能在外面使用它,因为f,cs,d在我看来不可见。由于 f , cs 和 d ,Memtrace会显示泄漏。
if(test == "a"){
Class2 *c2 = new Class2(param1,param2,param3,param4);
films[i] = c2;
}
else if(test == "b"){
Class3 *c3 = new Class3(param1,param2,param3,param4);
films[i] = c3;
}
else {
Class1 *c1 = new Class1(param1,param2,param3);
films[i] = c1;
}
我的FilmDB类有一个虚拟析构函数,它迭代数组并删除它,但它似乎没有解决我的问题。
for(int i = 0; i < n; i++)
delete films[i];
从评论中编辑:
我不允许在我的任务中使用std::vector
答案 0 :(得分:1)
我真的不明白为什么人们使用C ++,除非他们使用它的功能。使用vector并自动委托破坏任务。
使用vector
并在执行此操作之前阅读文档。
如果是矢量..你可以这样做
vector<classname> v;
v.push_back( class's object);
答案 1 :(得分:0)
你是否正在重复使用电影索引[i]?
在这种情况下,您需要在添加新分配的对象之前删除其中的内存:
if(test == "a"){
Class2 *c2 = new Class2(param1,param2,param3,param4);
delete films[i];
films[i] = c2;
}
else if(test == "b"){
Class3 *c3 = new Class3(param1,param2,param3,param4);
delete films[i];
films[i] = c3;
}
else {
Class1 *c1 = new Class1(param1,param2,param3);
delete films[i];
films[i] = c1;
}
为了使其正常工作,您需要films[i]
为NULL
或有效的内存位置。如果films[i]
未初始化并且您在其上调用delete,则会崩溃。你需要在我目前没有看到的程序部分处理它。
此外,最好调试并确保调用析构函数。