Я имею дело с map
, вторым элементом которого также является map
, вторым элементом которого является vector
. И во время процесса построения карты мне кажется, что я должен распределять память динамически, но тогда я не могу правильно освободить память. Моя проблема может быть сведена к исходному коду ниже.Где я ошибаюсь в деструкторе для этого контейнера C++?
Я просто не могу понять, почему desctructor неверен.
Кроме того, есть ли лучший способ избежать утечки памяти в этом случае?
#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;
}
[не используйте 'new'] (http://klmr.me/slides/modern-cpp/#1) и вы уже значительно снизила свои шансы на утечку памяти. – chris
@chris Но я просто не знаю правильной структуры данных, чтобы избежать использования 'new'. –