【发布时间】: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