Я создаю псевдо std :: vector. Я хочу иметь возможность объявить переменную Matrix B
и после этого присвоить ей значение, переданное другой переменной Matrix
. Matrix
имеет конструктор, который выделяет мемо
Vect(int size, char name) : name(name), size(size), store(new int[size]){}
и деструктор, который удаляет его в конце жизненного цикла var
~Vect(){
std::cout << "memo located: " << name << std::endl;
delete[] store;
}
К сожалению, метод, который использовался для возврата значения, возвращает его с деструктором называется
Vect operator- (){
Vect b(size,'C');
for (int i = 0; i < size; i++){
b.store[i] = -store[i];
}
return b; // <- here it calls destructor!!!
}
Я пытаюсь сделать это:
Vect m2;
Vect m1 = Vect(10, 'A');
m2 = -m1;
И получаю эту ошибку:
memo located: C
-1, -2, -3, -4, -5, -6, -7, -8, -9, -10,
memo located: A
memo located: C
a.out(46158,0x109e71dc0) malloc: *** error for object 0x7f9162401850: pointer being freed was not allocated
a.out(46158,0x109e71dc0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Как я могу обойти это с сохраненной функциональностью? Мой код:
#include <iostream>
class Vect {
int *store;
int size = 0;
char name;
public:
Vect operator- (){
Vect b(size,'C');
for (int i = 0; i < size; i++){
b.store[i] = -store[i];
}
return b;
}
int *getPointer(){
return store;
}
int getSize(){
return size;
}
bool set(int i, int v){
if (i >= size)
return false;
store[i] = v;
return true;
}
Vect(){}
Vect(int size, char name) : name(name), size(size), store(new int[size]){}
~Vect(){
std::cout << "memo located: " << name << std::endl;
delete[] store;
}
};
int main(int argc, char **argv){
Vect m2;
Vect m1 = Vect(10, 'A');
int i = 0;
while(m1.set(i++, i));
m2 = -m1;
int size = m2.getSize(), *ptr = m2.getPointer();
for (int i = 0; i < size; i++){
std::cout << ptr[i] << ", ";
}
std::cout << std::endl;
return 0;
}