在结束使用该对象之前调用析构函数来析构对象
Destructor called to destruct object before I finish using this object
在我的代码中有操作符+重载。在这个范围内,我定义了对象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
在运算符结束时超出作用域时,它会带走数据。
请阅读更多关于什么是三的规则?
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值