-2

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

私は C++ メモリ プロファイリングの初心者です。Valgrind がこの行のリークを報告しました

m_propertyManager(new coral::PropertyManager);

だから私はそれを次のように修正しました

coral::PropertyManager Mgr;
m_propertyManager(&Mgr);

&Mgrは自動的に削除されると思いますが、やはり valgrind がこれでリークを報告しています。

4

2 に答える 2

0

new coral::PropertyManagerヒープに新しい PropertyManager を割り当てますが、これは一時変数であるため、解放することはありません。これは Java の標準的なイディオムです。Java はガベージ コレクション言語であり、GC がこのダングリング リファレンスを解放してくれるからです。

何らかの理由でここを使用する場合new、これを行う適切な方法は次のとおりです。

auto *pm = new coral::PropertyManager; // auto is C++11 syntax
m_propertyManager(pm);
delete pm; // when you're done using it

2番目のオプションはMgr、関数が終了すると解放されるスタック上の自動変数として割り当てるという点で正しいです。Mgr のアドレスm_propertyManager(&Mgr);を関数に渡します。これにより、Mgr オブジェクトを変更できるようになります (ただし、Mgr を参照として渡す方がよいでしょう)。

m_propertyManager が現在のスコープが終了した後も存続するオブジェクトであり、Mgr への参照をどこかに保存している場合、現在のスコープを終了して Mgr オブジェクトが破棄されると、m_propertyManager が無効なメモリへの参照を保持していることに注意してください。

于 2013-01-09T12:09:54.907 に答える
0

でメモリを割り当てた場合はnew、 を使用してどこかで解放する必要がありますdeletem_propertyManagerの寿命を管理することになっていない場合はPropertyManager、ポインターを破棄して、割り当てられたメモリを残し、アクセスせずに残します。

一方、2 番目のソリューションはクラッシュします。見て:

{
    coral::PropertyManager Mgr;
    m_propertyManager->SetManager(&Mgr); // You pass pointer to Mgr here
}
// Here Mgr no longer exists, so m_propertyManager
// now contains the pointer to non-existing object

次のいずれかを行う必要があります。

  • PropertyManager( を使用して) 動的に作成newし、それへのポインタをどこかに保持し、 を使用してある時点で明示的に解放しdeleteます。
  • move ctor inPropertyManagerを実装し、値で渡します (m_propertyManagerの独自のインスタンスを暗黙的に自動的に割り当てますPropertyManager) 。
  • (2 番目の例のように) 静的割り当てを使用しますが、少なくともm_propertyManager.
  • m_propertyManager 内である種の自動ポインタ (std::shared_ptr や std::unique_ptr など) を使用する
于 2013-01-09T12:10:47.963 に答える