Присваивание одного объекта структуры / класса другому с помощью оператора "="

У меня есть структура aa и я пытаюсь запустить такой код:

aa * b = new aa;
aa * c = new aa;
c=b;
delete (b);
c.useSomeFunction

Могу ли я использовать объект, на который указывает c после уничтожения b?

Тот же вопрос в случае:

aa * b = new aa;
aa * c ;
c=b;
delete (b);
c.useSomeFunction

2 ответа

Решение

Название вопроса вводит в заблуждение, потому что вы не используете operator=() в вашем коде. Вы назначаете только указатели, которые являются встроенными типами.

Как указано выше:

В вашем первом примере назначение указателя приводит к утечке памяти, как объект (*c) больше не может быть удалено. Также вы не можете вызвать функцию (*b) (даже если указано c после удаления объекта (*b),

Во втором примере вы не получите утечку памяти. Обратите внимание, что в рабочем коде вы должны инициализировать каждый указатель с помощью nullptr, Также здесь вы не можете получить доступ к функции (*b) после удаления объекта.

вызов функции должен быть c->useSomeFunction() для того, чтобы по синтаксически правильно.

То, что вы, вероятно, хотите (и предлагается по названию), это создать новый объект и назначить ему содержимое старого. Что-то вроде:

struct aa {
  aa():x(0),y(0){}
  aa& operator=(const aa& rhs);
  int foo(){return x-y;}
  int x;
  int y;
};

aa& aa::operator=(const aa& rhs){
  if (this == &rhs) {return *this;}
  x = rhs.x; 
  y = rhs.y;
  return *this;
}

int main(){
  aa *b = new aa();
  aa *c = new aa();
  *c = *b;
  delete(b);
  c->foo();
  delete(c);
  return 0;
}

В ваших примерах оба указателя указывают на один и тот же объект, поэтому после его уничтожения ни один из них не является действительным. Кроме того, в вашем первом примере c=b автоматическая утечка памяти, так как вы теряете возможность освободить то, что вы выделили в aa * c = new aa,


Также это не может быть реальным кодом, так как b.usesomefunction не будет компилироваться Вы имели в виду b->use..,

Другие вопросы по тегам