2011-09-14 36 views
3

は、私は次のようしていると言う:fooがヒープに割り当てられていたのでこれはメモリの問題を引き起こしますか?

Foo* foo = new Foo(bar); 

//later on 
*foo = Foo(anotherBar); 

は、この原因の問題がないか、一時はFooからのメモリはヒープ上のfooのアドレスにコピーされますか?

おかげ

+0

も参照してください:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro

答えて

10

*foo = Foo(anotherBar);Fooタイプのオブジェクトへの定期的な割り当てよりも違いはありません。 *fooは、Foo型の左辺値を返し、それに割り当てています。

短い答え:それは問題を引き起こさない、一時的にfooによって指されるFooオブジェクトをヒープにコピーされます。

+9

後で 'foo'を削除する必要があります。そして、 'Foo'の代入演算子が正しく実装され、元のオブジェクトが管理している可能性のあるリソースがすべて解放されると仮定しています。 – Praetorian

+0

...あなたの代入演算子がデータをリークしない限り... – bitmask

+0

...またはFooが新しい演算子を奇妙な方法でオーバーライドするか...または... C++で考慮する必要がある他の多くのもの –

2

ある時点でfooを削除することを忘れない限り、メモリリークは発生しません。

1

Fooがヒープ上に何かを割り当てる場合、最初のインスタンスのデストラクタは呼び出されないため、割り当てが解除されません。あなたが代入演算子は、正しいことを行うだろうことを確認することができない場合は、メモリを解放せず手動で削除して再構築を検討することもでき

+0

コンストラクタではなくデストラクタ?デストラクタがある場合、[C++ 3ルール](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three/4172961#4172961)は、代入演算子あまりにも正確にそのために。 – Flexo

+0

bluh?はい、それは私が意味するものです! – mkb

1

foo->~Foo(); 
foo = new (foo) Foo(anotherBar); 

は、私は確かにこのことをお勧めしません、それは非です直感的で魅力的ではありませんが、私は実際に誰かが割り当て解除と再割り当てを避けたい場合に備えて、それを外に置くことを考えました。deleteと別のnewです。

リソース管理コンテナのために、すべてnewを回避することは、はるかに好ましい方法です。

-1

2つのオブジェクトは、同じポインタを使用して実行時に作成されています。 それは2番目のメモリ位置を指しているので、最初に にアクセスしてヒープに戻すことはできません。

+0

これは間違っています。作成された2番目のオブジェクトは一時的なもので、*新しい*を介して割り当てられません*。最初のオブジェクトは逆参照されているので、代入はポインタ代入ではありません。 **ポインタが指すアドレスは変更されません** – Flexo

関連する問題