У меня есть один класс (A
), который знает, когда его следует удалить. Я полагаю, что объект не может непосредственно удалить себя (то есть вы не можете вызвать деструктор изнутри него), поэтому я использовал обратный вызов.
Вот псевдокод моего текущего решения:
class A {
Owner* owner; // is set in constructor
A(Owner* ow) : owner(ow) {}
void willDeleteOurself() {
owner->deleteObject();
}
}
class Owner {
A* obj;
Owner() { // e.g. constructor
obj = new A(this);
}
void deleteObject() {
delete obj;
}
}
У меня есть объект класса Owner
, которому принадлежит объект класса A
. Теперь, в какой-то момент, obj
«знает», что оно должно быть удалено, и происходит вызов willDeleteOurself()
. Кажется, этот код работает.
Теперь мой вопрос таков: Это безопасный способ удаления obj
?
Я обеспокоен тем, что когда метод deleteObject
возвращает (достигает }
), он возвращается к концу willDeleteOurself()
, но объект, из которого был вызван этот метод, был уничтожен.
Безопасна ли эта конструкция, когда у меня больше нет операторов, ссылающихся на obj
после вызова owner->deleteObject();
?
Обновление
Спасибо за ответы. Я немного упростил здесь. У меня нет A* obj;
, но бустер смартпоинт (один, а иногда и на карте) к объекту. Я думаю, что если я вызову delete this
для обернутого объекта, smartpointer не распознает, что базовый объект удален. Это правильно?
Поскольку delete this
(а также мой код выше) "опасен", есть ли более безопасный способ решения моей проблемы?