以此程序为例:
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
对象?
答案 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)
首先确实没有必要使用new
和delete
(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
,没问题。