如何删除我创建的这个对象?

时间:2012-03-11 06:01:42

标签: c++ new-operator delete-operator

以此程序为例:

class Piece
{
public:
    Piece(bool color);

protected:
    bool color;
};

Piece::Piece(bool color)
{
    this->color = color;
}

//-----------------------------

class King : public Piece
{
public:
    King(bool color);
};

King::King(bool color) : Piece(color)
{
    // empty
}

//-----------------------------

class Tile
{
public:
    // constructors/destructors
    Tile(Piece * ppiece, int rrow, int ccol);
    ~Tile();

private:
    Piece * piece;
    int row, col;

};

Tile::Tile(Piece * ppiece, int rrow, int ccol)
{
    this->ppiece = piece;
    this->row = rrow;
    this->col = ccol;
}

//---------------------------

int main() 
{
    Tile * tile = new Tile(new King(0), 1, 1);
}

在函数main()中,我声明了一个新的King并将其传递给Tile构造函数。如何删除我创建的King对象?

4 个答案:

答案 0 :(得分:5)

如上所述,Tile Constructor接收新King作为参数ppiece

Tile Constructor然后不对ppiece做任何事情,并且内存不能被释放。它被“泄露”了。

鉴于Tile有一个成员piece,我建议将其分配到那里:

Tile::Tile(Piece * ppiece, int rrow, int ccol)
{
    this->row = rrow;
    this->col = ccol;
    this->piece = ppiece;
}

然后你可以在Tile析构函数中释放它:

Tile::~Tile()
{
    delete piece;
}

答案 1 :(得分:1)

已经有好几个好的答案,但我想我至少会提到这个...这个话题目前对你来说可能太先进了,但在某些时候,它绝对值得学习“智能”指针。 Boost :: shared_ptr是一个很好的起点。还有std :: unique_ptr。

答案 2 :(得分:0)

我建议将所有部分保留在Tile集之外的自己的数组中,在同一级别创建和删除它们。

然而,如果这是不可能的。如果将这件作品从瓷砖上移除,我会说删除它。

此外,还有一个清除您的图块集的功能,它会迭代并删除该图块上的各个部分。

您也可以将其作为~Tile()的一部分,但我个人不喜欢在不同级别创建/删除。

如果您使用析构函数,请注意保持指向Tile外部的指针。

答案 3 :(得分:0)

首先确实没有必要使用newdelete(C ++不是Java)。您可以将类对象视为值,就像使用int一样。

class Tile
{
public:
    // constructors/destructors
    Tile(Piece ppiece, int rrow, int ccol);
    ~Tile();

private:
    Piece piece;
    int row, col;

};

Tile::Tile(Piece ppiece, int rrow, int ccol)
{
    this->ppiece = piece;
    this->row = rrow;
    this->col = ccol;
}

//---------------------------

int main() 
{
    Tile tile(King(0), 1, 1);
}

没有new,没有delete,没问题。