2014-01-23 88 views
0

我在调用程序的析构函数时遇到了一些问题。我有这些类:C++:删除指针阵列时出错

  • myModule是指针数组的基类。
  • myModule_in是一个代表具有输入端口的模块的子类(有一个myModule_outmyModule_inout,因为它不是必需的,所以不会显示在这里)。
  • moduleC是输入端口模块之一(moduleAmoduleBmyModule_outmyModule_inout)。

Mymodule中:

class myModule 
    { 
    public: 

     myPort* secondary_ins[NUM]; 

     myModule() {} 

     virtual ~myModule() 
     { 
     for(int i=0; i<NUM; i++) 
     { 
      if(secondary_ins[i]) 
      delete secondary_ins[i]; 
     } 
     } 

     virtual void connect(myModule &m) = 0; 
    }; 

myModule_in:

class myModule_in : public myModule 
    { 
    public: 
     virtual ~myModule_in() {} 

     virtual void connect(myModule &m) 
     { 
     secondary_ins[ins] = new myPort(); 
     ... 
     } 

    }; 

moduleC:

class moduleC : public myModule_in 
    { 
    public: 

     moduleC(); 
     ~moduleC() {} 

     void connect_modules() {...} 

    }; 

主:

int main(...) 
    { 
     moduleA mA; 
     moduleB mB; 
     moduleC mC; 
     ... 
     mA.connect(mB); 
     mB.connect(mC); 
     ... 
     return 0; 
    } 

该代码编译正确并且工作正常,直到执行结束,我得到的段错误为:delete secondary_ins[i];return 0;被调用。奇怪的是,其他模块的destructor也被称为,并没有任何问题。处理从基类继承的指针数组可能有问题吗?有任何想法吗?

谢谢:)

+0

http://bit.ly/1dS4wcV – 735Tesla

+0

哦!谢谢@ 735Tesla!我永远不会想到这一点! – makeMonday

回答

4

当你声明:

myPort* secondary_ins[NUM]; 

无处可保证阵列将被0初始化。因此,测试:

if(secondary_ins[i]) 

在析构函数可能传递即使元素是不是一个有效的指针初始化。为了方便解决,只需使用0(在C++ 11之前)或nullptr(从C++ 11开始)初始化数组。

对于真正的解决,只是使用的std::vectorstd::arraystd::unique_ptr的组合。

+0

我只是写道,我已经尝试过,并没有工作。但我只是意识到我在错误的地方初始化阵列。在这里,还有一个问题。我在'myModule'中做了这件事,它不起作用,所以我在每个'moduleX'中做了它(现在它工作)。可以吗?有没有一种通用的方法来做到这一点?再次感谢! – makeMonday

+1

@makeMonday,是的,你使用'std :: unique_ptr'来自动初始化为'nullptr'。 – Shoe