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

时间:2014-01-23 16:22:54

标签: c++ arrays pointers segmentation-fault destructor

当我的程序的析构函数被调用时,我遇到了一些问题。我有这些条款:

  • 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也被调用,没有任何问题。也许处理从基类继承的指针数组有什么问题?有什么想法吗?

谢谢:)

1 个答案:

答案 0 :(得分:4)

宣布:

myPort* secondary_ins[NUM];

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

if(secondary_ins[i])
即使元素未使用有效指针初始化,析构函数中的

也可能会通过。为了便于修复,只需使用0(在C ++ 11之前)或nullptr(从C ++ 11开始)数组初始化。

对于实际修复,只需使用std::vectorstd::arraystd::unique_ptr的组合。