一个物体可以自我毁灭吗?

时间:2012-03-25 21:47:59

标签: c++ object destroy

我有一个需要自我毁灭的物体。

  • 可以吗?

  • 示例错了吗?

    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;
    }
    

5 个答案:

答案 0 :(得分:27)

是的,从成员函数中调用delete this是合法的。但是非常这很少是一个很好的理由(特别是如果你正在编写惯用的C ++,其中大多数内存管理任务应该委托给容器,智能指针等)。

你需要非常小心:

  • 自杀对象必须是通过new动态分配的(不是new[])。
  • 一旦一个对象自杀了,它就是未定义的行为,它可以做任何依赖于它自己存在的东西(它不能再访问它自己的成员变量,调用它自己的虚函数等)。

答案 1 :(得分:8)

答案 2 :(得分:2)

是的,它应该有效。即使delete this;也是允许的。

但是调用specialMoves()的代码可能会让人感到非常惊讶。

答案 3 :(得分:1)

  

问:一个物体可以自行毁灭吗?

答:好的。 “删除这个”是COM / ActiveX中流行的习语

就你的算法而言,我建议:

  • “board”对象有“tiles”。也许只是一个简单的二维阵列。

  • 你从n“件”开始

  • 某些控制器(可能是“游戏”对象)相对于“瓷砖”移动“片段”。

  • 每个“图块”都引用0或1“件”

我不确定我是否有理由在每次移动的基础上创建或删除任何内容。

... IMHO

答案 4 :(得分:0)

只要在调用销毁对象后不访问成员变量或this指针,就应该没问题。因为看起来你没有做这些事情,所以这个例子应该可行。