Может ли объект уничтожить себя?
У меня есть объект, который нужно уничтожить.
-
Можно ли это сделать?
-
Неверный пример?
void Pawn::specialMoves(Coordinate const& from, Coordinate const& to, int passant)
{
/*...*/
m_board->replace(to, new Queen(m_colour));//replace pawn by queen
}
void Board::replace(Coordinate const &to, Piece* newPiece)
{
delete tile[to.x()][to.y()];
tile[to.x()][to.y()] = newPiece;
}
Ответы
Ответ 1
Да, это законно вызывать delete this
изнутри функции-члена. Но там очень редко бывает хорошей причиной для этого (особенно если вы пишете идиоматический С++, где большинство задач управления памятью должны быть делегированы в контейнеры, интеллектуальные указатели и т.д.).
И вам нужно быть очень осторожным:
- объект самоубийства должен быть динамически распределен через
new
(не new[]
).
- Когда объект совершил самоубийство, поведение undefined для него делает все, что зависит от его собственного существования (он больше не может обращаться к своим собственным переменным-членам, вызывать свои собственные виртуальные функции и т.д.).
Ответ 2
Здесь хорошая проверка работоспособности для выполнения delete this
.
Ответ 3
Да, это должно сработать. Разрешено даже delete this;
.
Но код, вызывающий specialMoves()
, может оказаться для неприятного сюрприза.
Ответ 4
Q: Может ли объект уничтожить себя?
A: Конечно. "delete this" - популярная идиома в COM/ActiveX
Что касается вашего алгоритма, я бы предложил:
-
Объект "доска" имеет "плитки". Возможно, просто простой двухмерный массив.
-
Вы начинаете с n "штук"
-
Некоторые контроллеры (возможно, "игровой" объект) перемещают "кусок" относительно "плитки".
-
Каждая "плитка" имеет ссылку на 0 или 1 "штук"
Я не уверен, что вижу какую-либо причину для создания или удаления чего-либо на основе движения.
ИМХО...
Ответ 5
Пока вы не получаете доступ к переменным-членам или указателю this
после вызова для уничтожения объекта, вы должны быть в порядке. Поскольку он не появляется, вы делаете что-либо из этого, пример должен работать.