【问题标题】:C++ destructor for class contains array of ptr to objects [closed]类的C ++析构函数包含对象的ptr数组[关闭]
【发布时间】:2016-10-28 18:45:06
【问题描述】:

例如,如果我们有 2 个类

class A{
  int size;
  A** arr;
}
class B{
  int size;
  A** arr;
}

对于 A 的构造函数我写了:

A::A(){
  this->arr=new A* [20];
}

对于 B 的构造函数我写了:

B:B(){
  this->arr=new A* [20];
}

我为 A 的析构函数写了:

A:~A(){
  for(int i=0;i<this->size;i++){
    delete this->arr[i];
  }
  delete [] this->arr;
}

对于 B 的析构函数我写了:

  B:~B(){
  for(int i=0;i<this->size;i++){
    delete this->arr[i];
  }
  delete [] this->arr;
}

请注意,随着我将更多 obj 放入 arr 中,大小会增加。 现在我的问题是,我在测试的时候,没有错,但是主程序返回后,它给了我段错误?

【问题讨论】:

  • 你想做什么?如果您实际分配了嵌套数组,这将是 A-ception,这会将我们带到您的 UB... 是的,size 同样具有不确定的价值。
  • @LogicStuff,我在测试程序时没有任何问题..
  • @NeoA 析构函数正在完成它的工作——它不应该受到责备。问题是您可能正在使析构函数破坏未分配的内存,或者通过不实现正确的复制构造函数和/或赋值运算符来双重释放相同的内存。另外请发布minimal reproducible example,这样其他人就不必询问您有关size 变量或您在创建对象和销毁对象之间的调用之间所做的事情。
  • 别生我的气,但是……嗯,事实上,根本不回答这个问题;这不是为了我。就读吧。那么,您有什么理由不使用向量?
  • @NeoA 同样,问题不在于析构函数。析构函数表明您在其他地方弄乱了内存。注释掉析构函数就像在你的汽车仪表盘警告灯上贴上一条胶带,认为你的汽车已经解决了问题。所以在你的析构函数中没有什么可以“修复”的。该修复应应用于您的其余代码(您尚未向我们展示)。

标签: c++ destructor


【解决方案1】:

你也应该在构造函数中初始化大小。

A::A(){
   this->size=20;
   this->arr=new A* [20];
}

B也一样

【讨论】:

  • 不,size是我在arr中放入的A的实际数量,20是应该的容量。很抱歉造成混乱
【解决方案2】:

在我看来,这是不实现复制构造函数并通过副本传递实例的经典案例。你真的应该阅读一两篇关于 C++ 内存管理的文章,或者使用 shared_ptr/unique_ptr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多