在结束使用该对象之前调用析构函数来析构对象

Destructor called to destruct object before I finish using this object

本文关键字:对象 调用 析构函数 析构 结束      更新时间:2023-10-16

在我的代码中有操作符+重载。在这个范围内,我定义了对象ans,我想要构建并返回它,但是似乎析构函数在我返回ans之前就破坏了它,所以这个方法返回一些未定义的值。

我不明白我错在哪里?它是析构函数、构造函数,还是在操作符+的重载中?

下面是我的代码:
class vector1{
    int * arr;
int size;
public:
//constructors
vector1(){}
vector1(int n){
    size=n;
    arr= new int[size];
}
//functions
int get_size(){return size;}
void init(){  //initialize all array cells to 0
    for(int i=0;i<size;i++)
        arr[i]=0;
}
int get_value_in_index(int index){
    return arr[index];
}
void set_value_in_index(int i, int num){
    arr[i]=num;
}
int & operator[](int i){
    int default_val=0;
    if (i<0 || i>size){
        cout<<"index not valid"<<endl;
        return default_val;
    }
    return arr[i];
}
vector1 operator+(vector1 & ob);
//destructor
~vector1(){
    delete [] arr;
}
};
vector1 vector1:: operator+(vector1 & ob){
vector1 ans(size);
if (ob.get_size()!=size){  //if the arrays are not the same size return array of     '0', this array size
    cout<<"vectors not the same length. can't sum them"<<endl;
    //test
    //exit(1);
    ans.init();
}
else{
    for (int i=0;i<size;i++)
        ans.set_value_in_index(i,arr[i]+ob.get_value_in_index(i));
}
return ans;
}

感谢您的时间和帮助。

操作符+返回一个新的vector1类的副本。
但是原始的(在函数开始时声明的)在块的末尾(在右括号}之前)被销毁。

析构函数然后删除内部数组arr
因此,复制的vector1对象指向一个已删除的数组。

你应该创建一个复制构造函数来复制内部数组。

vector1(const vector1& _other ){
 //copy .arr from the other one to this one
}

当您从operator+返回ans的浅拷贝时,会留下两个指向相同数据的vector1实例。当第一个实例超出作用域时,它将删除这两个实例所指向的数据。为了纠正这个问题,你需要添加一个复制构造函数来对vector1

进行深度复制。
vector1(const vector1& other)
{
    // make a deep copy from "other.
}

由于没有定义复制构造函数,所以编译器会创建一个默认的复制构造函数。

您的operator+返回向量的浅拷贝。当ans在运算符结束时超出作用域时,它会带走数据。

请阅读更多关于什么是三的规则?