繁体   English   中英

C ++:删除指针数组时出错

[英]C++: Error deleting array of pointers

调用程序的析构函数时遇到一些问题。 我有以下几种情况:

  • 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;被调用return 0; 奇怪的是,其他模块的destructor也被调用,没有任何问题。 从基类继承的指针数组的处理可能有问题吗? 有任何想法吗?

谢谢 :)

当您声明:

myPort* secondary_ins[NUM];

无处保证数组将被初始化为0 因此测试:

if(secondary_ins[i])

即使未使用有效的指针初始化元素,析构函数中的可能也会通过。 为了方便修复,只需使用0 (在C ++ 11之前)或nullptr (从C ++ 11开始)初始化数组即可。

对于真正的解决方案 ,只需结合使用std::vectorstd::arraystd::unique_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM