C++ 在这种情况下,如何释放内存?
我有以下代码。我的程序有一个基类,即c1c2和c3是它的派生类。我还有一个名为FilmDB(数据库)的类,它将我的所有电影存储在一个数组中,名称为films。在这些if语句中,我将胶片放入这个数组中,这取决于它的类型。(试验条件)。它工作得很好,但是f,cs,d将永远不会空闲,内存泄漏会出现。问题是我不能在if语句中使用delete[],因为我的程序崩溃了,但我不能在外部使用它,因为我看到的f、cs、d在那里不可见。Memtrace显示由于f、cs和d而导致的泄漏C++ 在这种情况下,如何释放内存?,c++,C++,我有以下代码。我的程序有一个基类,即c1c2和c3是它的派生类。我还有一个名为FilmDB(数据库)的类,它将我的所有电影存储在一个数组中,名称为films。在这些if语句中,我将胶片放入这个数组中,这取决于它的类型。(试验条件)。它工作得很好,但是f,cs,d将永远不会空闲,内存泄漏会出现。问题是我不能在if语句中使用delete[],因为我的程序崩溃了,但我不能在外部使用它,因为我看到的f、cs、d在那里不可见。Memtrace显示由于f、cs和d而导致的泄漏 if(test == "a")
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];
for(int i=0;i
根据评论编辑:
<>我不允许使用<代码> STD::向量在我的任务< P>我真的不明白为什么人们不使用C++,除非他们使用它的特性。使用vector并自动委派销毁任务 使用
vector
并在执行此操作之前阅读文档
对于向量,你可以这样做
vector<classname> v;
v.push_back( class's object);
向量v;
v、 推回(类的对象);
您是否在重复使用电影索引[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,它将崩溃。你需要在我目前没有看到的节目部分处理这个问题
此外,最好进行调试并确保调用了析构函数。您应该使用std::vector,避免在C++中使用delete,并提供一个适当的问题。我们可以;我无法从中理解。
Csaladi
、Dokumentum
和Film
是否有共同的基类?那个类有虚拟析构函数吗?filmcount
是正确的值吗?Film是基类,Csaladi和Dokumentum是派生类。我试图编辑代码以使其更易于理解。请在调试器中运行代码并查找崩溃。地球上没有任何方法可以提供任何东西,除了摇摆(疯狂的猜测),我们可以提供为什么会发生这种情况的原因,因为你甚至没有任何类似于复制你的问题的东西。我不允许在我的任务中使用向量,这是我忘记提到的东西,对不起。@TamasHargitai编辑你的问题。我们猜不出你想做什么。这需要做的不仅仅是推一个std::vector
,因为OP有一个多态的派生层次结构,这个解决方案会回归到。我不知道所有这些名称,但在这里是的……一个适当的层次结构的类可以做到这一点@WhozCraig@WhozCraig.:如果可能的话,你可以建议我修改,或者你可以修改,修改或者写一个新的答案…无论如何,它会帮助我回答这个半指定的问题。