在这种情况下,如何释放内存?



我有以下代码。我的程序有一个基类,即c1。C2 和C3是其派生类。我还有一个名为FilmDB(database) 的类,它将我所有的电影存储在一个数组中,这个数组的名字是films。在这些 if 语句中,我根据其类型将电影放入此数组中。(测试条件)。它工作得很好,但是f,cs,d永远不会免费,内存泄漏来了。问题是我不能在 if 语句中使用 delete [],因为我的程序崩溃了,但我不能在外面使用它,因为 f、cs、d 在那里不可见。Memtrace 显示由于fcsd而导致泄漏。

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

真的我不明白为什么人们使用C++,除非他们使用它的功能。使用矢量并自动委派销毁任务。

在执行此操作之前,请使用vector并阅读文档。

在矢量的情况下..你可以这样做

vector<classname> v;
v.push_back( class's object);

您是否在重用电影索引[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,它将崩溃。您需要在我目前没有看到的程序部分处理它。

此外,最好调试并确保正在调用析构函数。

最新更新