C ++で新しい演算子が占有するメモリを削除する方法

Possible Duplicate:
Why does the use of ‘new’ cause memory leaks?

私はC ++メモリプロファイリングの新機能です。 Valgrindはこのラインで漏れを報告した

m_propertyManager(new coral::PropertyManager);

だから私はそれを

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

I guess &Mgr is deleted automatically but again valgrind is reporting leak in this.

2
nl ru de

2 答え

new でメモリを割り当てる場合は、 delete を使用してメモリを解放する必要があります。 m_propertyManagerPropertyManager の有効期間を管理していないと、ポインタはメモリを割り当てたままで放置され、アクセスすることはありません。

一方、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 > PropertyManager のムービーを実装し、値を渡します( m_propertyManagerPropertyManager のインスタンスを暗黙的に自動的に割り当てます)。>
  • 静的割り当てを使用します(2番目の例のように)。ただし、 m_propertyManager の長さの間は少なくとも/li>
  • m_propertyManagerの中にある種の自動ポインタ(std :: shared_ptrやstd :: unique_ptrなど)を使用する
0
追加された

new coral::PropertyManager allocates a new PropertyManager on the heap, but because it is a temporary variable you will never release it. This is the standard Java idiom, since Java is a garbage-collected language where the GC will take care of releasing this dangling reference for you.

何らかの理由でここで new を使用したい場合、これを行う適切な方法は次のようになります:

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

Your second option is correct, in that it allocates Mgr as an automatic variable on the stack, which will be released when the function exits. m_propertyManager(&Mgr); passes the address of Mgr to the function, which will allow it to modify the Mgr object (although this is probably better done by passing Mgr as a reference).

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

0
追加された
@mgr:私は間違っているかもしれませんが、関数へのユニークなポインタのコピーを渡すことはできませんか? std :: shared_ptrはこのユースケースではもっと賢明なオプションではないでしょうか、私が間違っているときに私を修正してください。
追加された 著者 Skalli,
m_propertyManager(std :: unique_ptr(new coral :: PropertyManager))のようにstd :: unique_ptrを使うのが良いでしょう。
追加された 著者 mgr,
はい、あなたは正しいです、ここで共有ポインタが必要です。
追加された 著者 mgr,