2017-05-07 77 views
-3

我有以下代码。我的程序有一个基类,即c1c2c3是它的派生类。我也有一个名为FilmDB(数据库)的课程,它将我所有的电影存储在一个阵列中,其名称是电影。在这些if语句中,我根据其类型将电影放入此数组中。 (测试条件)。它工作得很好,但是f,cs,d永远不会自由,内存泄漏来了。问题是我不能在if语句中使用delete [],因为我的程序崩溃了,但是我不能在外面使用它,因为在我看来,f,cs,d不可见。 Memtrace显示泄漏,因为f,csd如何在这种情况下释放记忆?

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在我的任务

+3

你应该使用_std :: vector_并避免使用_delete_在C++ – granmirupa

+0

中提供一个合适的问题。我们不能从中理解。 – coderredoc

+0

'Csaladi','Dokumentum'和'Film'有共同的基础类吗?这个类是否具有虚拟析构函数?电影计数是否正确? –

回答

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,则它将崩溃。你需要处理那些我目前没有看到的程序部分。

此外,最好调试并确保您的析构函数被调用。

1

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

使用vector,然后再阅读文档。

在vector..you的情况下可以这样做

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

我不允许在我的任务中使用矢量,这是我忘记提及的东西,对不起。 –

+2

@TamasHargitai编辑你的问题。我们无法猜测你想做什么。 – granmirupa

+0

由于OP具有多态派生层次结构,所以需要涉及到更多的参与,因为这个解决方案会回归到[object slicing](https:// stackoverflow) .COM /问题/ 274626 /什么,是对象切片)。 – WhozCraig