は、私は次のようしていると言う:fooがヒープに割り当てられていたのでこれはメモリの問題を引き起こしますか?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
は、この原因の問題がないか、一時はFooからのメモリはヒープ上のfooのアドレスにコピーされますか?
おかげ
は、私は次のようしていると言う:fooがヒープに割り当てられていたのでこれはメモリの問題を引き起こしますか?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
は、この原因の問題がないか、一時はFooからのメモリはヒープ上のfooのアドレスにコピーされますか?
おかげ
*foo = Foo(anotherBar);
はFoo
タイプのオブジェクトへの定期的な割り当てよりも違いはありません。 *foo
は、Foo型の左辺値を返し、それに割り当てています。
短い答え:それは問題を引き起こさない、一時的にfoo
によって指されるFoo
オブジェクトをヒープにコピーされます。
後で 'foo'を削除する必要があります。そして、 'Foo'の代入演算子が正しく実装され、元のオブジェクトが管理している可能性のあるリソースがすべて解放されると仮定しています。 – Praetorian
...あなたの代入演算子がデータをリークしない限り... – bitmask
...またはFooが新しい演算子を奇妙な方法でオーバーライドするか...または... C++で考慮する必要がある他の多くのもの –
ある時点でfooを削除することを忘れない限り、メモリリークは発生しません。
Foo
がヒープ上に何かを割り当てる場合、最初のインスタンスのデストラクタは呼び出されないため、割り当てが解除されません。あなたが代入演算子は、正しいことを行うだろうことを確認することができない場合は、メモリを解放せず手動で削除して再構築を検討することもでき
:
foo->~Foo();
foo = new (foo) Foo(anotherBar);
は、私は確かにこのことをお勧めしません、それは非です直感的で魅力的ではありませんが、私は実際に誰かが割り当て解除と再割り当てを避けたい場合に備えて、それを外に置くことを考えました。delete
と別のnew
です。
リソース管理コンテナのために、すべてnew
を回避することは、はるかに好ましい方法です。
2つのオブジェクトは、同じポインタを使用して実行時に作成されています。 それは2番目のメモリ位置を指しているので、最初に にアクセスしてヒープに戻すことはできません。
これは間違っています。作成された2番目のオブジェクトは一時的なもので、*新しい*を介して割り当てられません*。最初のオブジェクトは逆参照されているので、代入はポインタ代入ではありません。 **ポインタが指すアドレスは変更されません** – Flexo
も参照してください:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro