2012-03-11 71 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,沒有問題。

相關問題