-1

私は、2 番目の要素が a であり、2 番目の要素が a である a を扱ってmapmapますvector。また、マップ構築プロセス中に、メモリを動的に割り当てる必要があるようですが、メモリを適切に解放できません。私の問題は、以下のソースコードに縮小できます。

デストラクタが正しくない理由がわかりません。

また、この場合のメモリ リークを回避するためのより良い方法はありますか?

#include <vector>
#include <map>
#include <iostream>

using namespace std;

typedef vector<int> IntVect;
typedef map<int, IntVect> NumEle;
typedef map<int, NumEle> Nums;

class NumLess {
 public:
  Nums numSet;
  ~NumLess() {
    for (Nums::iterator I = numSet.begin(), E = numSet.end(); I != E; ++I) {
      NumEle &numEle = I->second;
      for (NumEle::iterator II = numEle.begin(), EE = numEle.end(); II != EE; ++II) {
        IntVect &intVect = II->second;
        intVect.clear();
        delete &intVect;
      }
      delete &numEle;
    }
  }
  friend ostream &operator<<(ostream &os, const NumLess &numLess) {
    for (Nums::const_iterator I = numLess.numSet.begin(),
                              E = numLess.numSet.end();
         I != E; ++I) {
      const NumEle &numEle = I->second;
      os << "NumEle:" << I->first << endl;
      for (NumEle::const_iterator II = numEle.begin(), EE = numEle.end();
           II != EE; ++II) {
        os << "IntVect  " << II->first << " | ";
        const IntVect &intVect = II->second;
        for (auto i : intVect) {
          os << i << " ";
        }
        os << endl;
      }
    }
    return os;
  }
};

int main(void) {
  NumLess numLess;
  for (unsigned h = 4; h > 0; --h) {
    NumEle *numEle = new NumEle();
    for (unsigned i = h; i > 0; --i) {
      IntVect *intVect = new IntVect();
      for (unsigned j = 0; j < i; ++j) {
        intVect->push_back(j);
      }
      numEle->insert(pair<int, IntVect>(i, *intVect));
    }
    numLess.numSet.insert(pair<int, NumEle>(h, *numEle));
  }
  cout << numLess;
  cout << "finished" << endl;
  return 0;
}
4

1 に答える 1

1

長い話を非常に短くすると、割り当てていないオブジェクトを削除しています。これを修正するには、デストラクタから削除を削除する必要があります。

メインにもリークがあります。ヒープ上にオブジェクトを作成していて、決して解放していません。作成されたオブジェクトがコンテナにコピーされます。このリークを修正するには、new を削除し、コンテナにオブジェクトを追加するだけです。


ポインターを使用したい場合 (私の意見では悪い)、 typedefs を変更する必要があります。

typedef map<int, IntVect*> NumEle;
typedef map<int, NumEle*> Nums;

「new」とメモリリークのない「main()」は次のとおりです。

int main(void) {
  NumLess numLess;
  for (unsigned h = 4; h > 0; --h) {
    NumEle numEle;
    for (unsigned i = h; i > 0; --i) {
      IntVect intVect;
      for (unsigned j = 0; j < i; ++j) {
        intVect.push_back(j);
      }
      numEle.insert(pair<int, IntVect>(i, intVect));
    }
    numLess.numSet.insert(pair<int, NumEle>(h, numEle));
  }
  cout << numLess;
  cout << "finished" << endl;
  return 0;
}
于 2013-08-31T14:12:03.373 に答える