2

重複の可能性:
「new」を使用するとメモリリークが発生するのはなぜですか?

私はSTLにかなり慣れていないので、オブジェクトへのポインタのベクトルではなく、オブジェクトのベクトルを一般的に保持することをお勧めします。その信条に従おうとして、私は次のシナリオに遭遇しました。

//Approach A
//dynamically allocates mem for DD_DungeonRoom object, returns a pointer to the block.
//then, presumably, copy-constructs the de-referenced DD_DungeonRoom as a 
//disparate DD_DungeonRoom object to be stored at the tail of the vector
//Probably causes memory leak due to the dynamically allocated mem block not being
//caught and explicitly deleted
mvLayoutArray.push_back(*(new DD_DungeonRoom()));

//Approach B
//same as A, but implemented in such a way that the dynamically allocated mem block
//tempRoom can be deleted after it is de-referenced and a disparate DD_DungeonRoom is
//copy-constructed into the vector
//obviously rather wasteful but should produce the vector of object values we want
DD_DungeonRoom* tempRoom = new DD_DungeonRoom();
mvLayoutArray.push_back(*(tempRoom));
delete tempRoom;

最初の質問:アプローチAでは、メモリリークが発生しますか?
2番目の質問:Aがメモリリークを生成すると仮定すると、Bはそれを解決しますか?3番目の質問:カスタムクラスオブジェクト(たとえば、「new」または「malloc」を介した動的割り当てが必要)を値によるベクトルに追加するためのより良い方法はありますか(または、より可能性が高いのは「何ですか」)?

ありがとう、CCJ

4

3 に答える 3

8

最初の質問:アプローチAでは、メモリリークが発生しますか?

はい。

2番目の質問:Aがメモリリークを生成すると仮定すると、Bはそれを解決しますか?

はい、しかしそれはばかげた解決策です。DD_DungeonRoomまた、のコピーコンストラクタまたはvector::push_back例外がスローされた場合は安全ではありません。

3番目の質問:カスタムクラスオブジェクト(たとえば、「new」または「malloc」を介した動的割り当てが必要)を値によるベクトルに追加するためのより良い方法はありますか(または、より可能性が高いのは「何ですか」)?

C ++のオブジェクトは、動的メモリ割り当てを必要としません。コンストラクターsansを呼び出すベクトルにオブジェクトを直接追加するだけnewです。

mvLayoutArray.push_back(DD_DungeonRoom());

さらに良いことに、コンパイラがこの機能をサポートしている場合(C ++ 11の新機能)、emplace_backコピーを完全にバイパスし、ベクター内でオブジェクトを直接構築する機能を使用することをお勧めします。コンストラクターに渡すのと同じ引数を渡すだけです。私たちの場合、それはありません:

myLayoutArray.emplace_back();
于 2013-01-09T18:23:51.450 に答える
2

アプローチAはリークを引き起こします、はい。アプローチ B はそうではありませんが、ヒープにオブジェクトを割り当て、ベクターにコピーを入れてから削除するだけなので、その場合は次のようにすることもできます。

DD_DungeonRoom tempRoom;
mvLayoutArray.push_back(tempRoom);

デストラクタをすぐに実行したい場合は、必要に応じてその周りにブロックを作成して、ローカル変数をスコープ外にすることができます。

また、メモリ リークが発生するかどうかに興味がある場合は、実際にそれを試して何が起こるかを確認するための優れたツールがたくさんあります。valgrindは非常に使いやすい例の 1 つです。

于 2013-01-09T18:27:24.670 に答える
1

aproch A の唯一の問題がメモリ リークである場合、shared_ptr のベクトルを使用してみませんか?

于 2013-01-09T18:38:12.753 に答える