Присваивание одного объекта структуры / класса другому с помощью оператора "="
У меня есть структура 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..
,