gpt4 book ai didi

c++ - 对象的析构函数导致崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:30 30 4
gpt4 key购买 nike

我是 C++ 的菜鸟。我有一个无论如何都无法解决的问题。我写了一段代码来更好地理解类和重载运算符:

#include <iostream>
#include <stdlib.h>
#include <stdarg.h>
using namespace std;

class vectmy {
public:
int size;
int *a;
vectmy(int n,int val);
~vectmy (){delete[] a; //IF I DELETE THIS PROGRAM WORKS
}
vectmy & operator = (const vectmy &);
};

vectmy::vectmy(int n,int val){
size=n;
a = new int[ n+1 ];
for (int i=0;i<n;++i){
*(a+i)=val;
}
}



vectmy& vectmy::operator= (const vectmy& param)
{
for (int i=0;i<3;++i) a[i]=param.a[i];
return *this;
}



vectmy operator+( vectmy left, vectmy right)
{
vectmy result = left;
for (int i=0;i<3;++i) result.a[i]=result.a[i]+right.a[i];

return result;
}



int main() {
int b1[3]={1,2,4};
vectmy d(3,2),b(3,4),c(3,0);

c=(b+d);

for (int j=0; j<3; ++j)cout<<c.a[j]<<' '<<endl;
return 0;
}

当我运行时它崩溃了。如果我删除它的析构函数。为什么会这样?

最佳答案

When I run it crashes. If I remove the destructor it works. Why it happens?

您的 operator + 在此处创建 left拷贝:

vectmy result = left;

由于您没有显式定义复制构造函数,编译器将隐式生成一个执行成员明智复制的复制构造函数。

a 数据成员的枯燥拷贝意味着 a 指针最终将指向 相同 的两个不同实例的位置 vectmy(resultleft),两者都会删除[]破坏。

这种双重删除会给您的程序带来未定义的行为,在您的情况下表现为崩溃。

这就是 Rule of Three 的要点:每次你有一个用户定义的复制构造函数、赋值运算符或析构函数时,你应该定义它们的所有 .

原因是您通常会定义其中一个函数,因为您正在管理某些资源(在您的情况下是内存),并且您通常希望在复制、销毁或分配管理资源的对象时执行适当的操作。

在这种特殊情况下,缺少适当的复制构造函数。您可以这样定义它:

vectmy::vectmy(vectmy const& v)
{
size=v.size;
a = new int[size];
*this = v;
}

此外,我建议您尽可能避免通过原始指针、newdelete(或其对应的数组)进行手动内存管理,并考虑使用 std::vector相反。

更新:

另请注意,您的operator + 按值接受其参数,这意味着每个参数都将被复制(即,将调用复制构造函数)。

由于这里实际上不需要拷贝,您可能希望通过引用获取参数(到 const):

vectmy operator + ( vectmy const& left, vectmy const& right)
// ^^^^^^ ^^^^^^

关于c++ - 对象的析构函数导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119762/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com