【问题标题】:C++: Error deleting array of pointersC++:删除指针数组时出错
【发布时间】:2014-02-14 07:59:22
【问题描述】:

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

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

我的模块:

    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;
    };

我的模块输入:

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

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

    };

模块C:

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

谢谢:)

【问题讨论】:

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


【解决方案1】:

当您声明时:

myPort* secondary_ins[NUM];

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

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

也可能通过。为了简单的修复,只需使用0(C++11 之前)或nullptr(C++11 开始)初始化数组。

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

【讨论】:

  • 我只是在写我之前已经尝试过但它不起作用。但我刚刚意识到我在错误的地方初始化了数组。在这里,还有一个问题。我在myModule 中执行此操作,但没有成功,所以我在我拥有的每个moduleX 中执行此操作(现在它确实有效)。可以吗?有没有通用的方法来做到这一点?再次感谢!
  • @makeMonday,是的,您使用 std::unique_ptr 自动将自己初始化为 nullptr
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2022-06-11
  • 2011-09-18
相关资源
最近更新 更多