0

これは宿題です。プログラムは正常に機能していますが、メモリ リークを取り除くのに苦労しています。

Class オブジェクトがあります。

オブジェクト クラスへのポインタを持つクラス objectPtr があります。

私は持っている...

typedef set<objectPtr> ObjectSet;

私のオブジェクトは次のように保存されます:

map<string, ObjectSet*>    myMap;

データ構造を調べてオブジェクトを削除しようとすると (それが私がやっていることだと思います...)、コードがクラッシュします。

for(map<string, ObjectSet*>::const_iterator it = myMap.begin(); it != myMap.end(); ++it) {
    for(ObjectSet::const_iterator e = it->second->begin(); e != it->second->end(); ++e)  
        delete e->getPtr();
}

これを行う正しい方法は何ですか?

4

1 に答える 1

1

の設計で基本的な RAII 原則を使用できますobjectPtrobjectPtr一般的な概念は、格納された へのポインタで delete を呼び出すクラスのデストラクタを定義することobjectです。次に、マップを 1 回ループして への生のポインタを削除するだけですObjectSetobjectPtrは (インスタンスへのポインタではなく) インスタンスとして格納されるため、ObjectSetが破棄されるとそのデストラクタが自動的に呼び出されます。

また、for ループで delete を呼び出しているため、非 const フォワード イテレータが必要になる可能性があります。

次に例を示します。

class object
{
   // ... interface details ...
};

class objectPtr
{
public:
   objectPtr(object* p) :
      ptr(p)
   {}

   ~objectPtr()
   {
      if (ptr)
         delete ptr;
   }

public:
   // ... interface details ...

private:
   object* ptr;
};


typedef set<objectPtr> ObjectSet;

map< string, ObjectSet* > myMap;

for(map< string, ObjectSet* >::iterator it = myMap.begin(); it != myMap.end(); ++it)
{
   ObjectSet* setPtr = it->second;
   if (setPtr)
      delete setPtr; // ObjectSet will call 'delete' for each instance of 
                     // objectPtr, which through RAII, will automatically
                     // delete the referenced instance of object
}
于 2013-03-25T05:02:47.223 に答える