Деструктор вызывается в методе, который передает значение переменной - PullRequest
0 голосов
/ 29 мая 2020

Я создаю псевдо 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; 
} 

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Я полагаю, вы хотите реализовать «идиому копирования и обмена». Вам нужно поменять данные из b (временный объект) на ваш объект, тогда временный будет безопасно уничтожен.

Демо: https://wandbox.org/permlink/BMccSpz03cpGuG6S

0 голосов
/ 29 мая 2020

То, что я пытаюсь сделать, невозможно достичь. Либо operator- должен инвертировать исходный объект, либо я должен реализовать operator= и изменить operator-

...