2012-02-07 5 views
1

DerivedClass1とDerivedClass2がBaseClassから派生したクラスで、BaseClassがポリモーフィックなクラスである場合、これら2つのコードスニペットのどちらが正しいのですか?複数の新しいものと1つの削除

BaseClass *ptr; 

ptr = new DerivedClass1; 
ptr->PrintName(); 

ptr = new DerivedClass2; 
ptr->PrintName(); 

delete ptr; 

または

BaseClass *ptr; 

ptr = new DerivedClass1; 
ptr->PrintName(); 

delete ptr; 

ptr = new DerivedClass2; 
ptr->PrintName(); 

delete ptr; 

単にPTRの値を再定義する「削除」、またはそれはメモリリークのいくつかの種類を起こすん使用する前に、「新しい」を複数回使用していますか?私はそれが愚かな質問である場合は失礼ですが、私はそれに答えを見つけるように見えなかった。

+0

手動削除が正しくC++を使用していない記号です。それを管理するためにスマートポインタの中にポインタを置くことをお勧めします。 –

答えて

5

あなたの最初の例は確かに漏れます。 2番目の例では、PrintName()が例外をスローしたとします。

std::unique_ptr<BaseClass> ptr; 

ptr.reset(new DerivedClass1); 
ptr->PrintName(); 

ptr.reset(new DerivedClass2); 
ptr->PrintName(); 

見て、馬を、何の削除:

良いアイデアは、std::unique_ptrとして、スマートポインタを使用することではありません!

+0

クール、ありがとう。私は、代わりにptr = new DerivedClass1を使うのではないかと思っています。 ptr.reset(新しいDerivedClass1)を使用する必要がありますか。 ?最初のものは私に構文エラーを与えます。 – Stupebrett

+0

@Stupebrett:あなたは正しいです。私はそれを修正します。 –

2

2番目が正しいです。最初のインスタンスはDerivedClass1のインスタンスをリークします。

1

確かにもう1つは正しいです。最初にメモリリークが発生します。

0

もちろん、それはリークです(実際には、メモリリークのライフタイムリークです)。ポインタ変数に値を代入すると、以前に保持されていた値、つまり最初の動的オブジェクトへのポインタが失われます。各動的オブジェクト(new表現で作成され、すなわちオブジェクト)(通常delete式で)手動で破壊されている必要があります

ptr = new Derived1; 
delete ptr; 
ptr = new Derived2; 
delete ptr; 
関連する問題