Деструктор вызывается для уничтожения объекта, прежде чем я закончу использовать этот объект

В моем коде есть оператор + перегрузка. В этой области я определяю объект 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;
}

Спасибо за ваше время и помощь.

1

Решение

Ваш оператор + возвращает копию нового vector1 учебный класс.
Но оригинал (объявленный в начале функции) уничтожается в конце блока (до закрывающей скобки) }).

Затем деструктор удаляет внутренний массив arr,
Так скопировано vector1 объект указывает на удаленный массив.

Вы должны создать конструктор копирования, который также будет копировать внутренний массив.

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

Другие решения

Когда вы вернетесь из operator+ мелкая копия ans сделано оставив два экземпляра vector1 указывая на те же данные. Когда первый экземпляр выходит из области видимости, он удаляет данные, на которые указывают оба. Чтобы исправить это, вам нужно добавить конструктор копирования, который делает глубокие копии в vector1

vector1(const vector1& other)
{
// make a deep copy from "other.
}
1

Вы не определили конструктор копирования, поэтому компилятор создал его по умолчанию.

ваш operator+ возвращает мелкая копия вашего вектора.
когда ans выходит из области видимости в конце оператора, забирает данные у него.

пожалуйста, прочитайте больше о Что такое правило трех?

0
По вопросам рекламы [email protected]