2012-03-11 59 views
0

拿这个程序为例:如何删除我创建的这个对象?

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

http://msdn.microsoft.com/en-us/library/h6227113.aspx – noMAD 2012-03-11 06:06:41

回答

5

如上所述,拼贴构造函数接收新的King作为参数ppiece

然后Tile构造函数不会对ppiece执行任何操作,并且内存不能被释放。它被“泄漏”。

鉴于瓷砖有一个成员piece,我建议有分配给它:

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

然后您可以稍后释放它在瓷砖的析构函数:

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

对不起,我最初的意思是像你这样分配'ppiece'到'piece'。我会改变这个问题。谢谢你的回答,这回答了我的问题。 – 2012-03-11 06:08:38

+0

你是否有理由在构造函数体内进行赋值而不是使用初始值设定项列表? – DCoder 2012-03-11 06:11:33

+0

我在身体内分配,因为我继续原来的代码风格。 (修改其他人的代码时,不要重写所有内容)。不过,我不知道OP为何如此写道。 – abelenky 2012-03-11 13:10:58

0

我会建议保持所有在Tile集之外的自己阵列中的棋子,在相同级别创建和删除它们。

但是,如果这是不可能的。如果从瓷砖中移除了这部分,我会说删除它。

另外,有一个函数可以清除你的贴图集,迭代并删除这个贴图上的棋子。

你也可以使它成为〜Tile()的一部分,但我个人不喜欢在不同层次上创建/删除。

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

1

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

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,没有问题。