Может ли объект уничтожить себя?

У меня есть объект, который нужно уничтожить.

  • Можно ли это сделать?

  • Неверный пример?

    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 для него делает все, что зависит от его собственного существования (он больше не может обращаться к своим собственным переменным-членам, вызывать свои собственные виртуальные функции и т.д.).

Ответ 3

Да, это должно сработать. Разрешено даже delete this;.

Но код, вызывающий specialMoves(), может оказаться для неприятного сюрприза.

Ответ 4

Q: Может ли объект уничтожить себя?

A: Конечно. "delete this" - популярная идиома в COM/ActiveX

Что касается вашего алгоритма, я бы предложил:

  • Объект "доска" имеет "плитки". Возможно, просто простой двухмерный массив.

  • Вы начинаете с n "штук"

  • Некоторые контроллеры (возможно, "игровой" объект) перемещают "кусок" относительно "плитки".

  • Каждая "плитка" имеет ссылку на 0 или 1 "штук"

Я не уверен, что вижу какую-либо причину для создания или удаления чего-либо на основе движения.

ИМХО...

Ответ 5

Пока вы не получаете доступ к переменным-членам или указателю this после вызова для уничтожения объекта, вы должны быть в порядке. Поскольку он не появляется, вы делаете что-либо из этого, пример должен работать.