Is valgrind crazy or is this is a genuine std map iterator memory leak?
- by Alberto Toglia
Well, I'm very new to Valgrind and memory leak profilers in general. And I must say it is a bit scary when you start using them cause you can't stop wondering how many leaks you might have left unsolved before!
To the point, as I'm not an experienced in c++ programmer, I would like to check if this is certainly a memory leak or is it that Valgrind is doing a false positive?
typedef std::vector<int> Vector;
typedef std::vector<Vector> VectorVector;
typedef std::map<std::string, Vector*> MapVector;
typedef std::pair<std::string, Vector*> PairVector;
typedef std::map<std::string, Vector*>::iterator IteratorVector;
VectorVector vv; MapVector m1;
MapVector m2;
vv.push_back(Vector());
m1.insert(PairVector("one", &vv.back()));
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
IteratorVector i = m1.find("one");
i->second->push_back(10);
m2.insert(PairVector("one", i->second));
m2.clear(); m1.clear(); vv.clear();
Why is that? Shouldn't the clear command call the destructor of every object and every vector?
Now after doing some tests I found different solutions to the leak:
1) Deleting the line i-second-push_back(10);
2) adding a delete i-second; after it's been used.
3) Deleting the second vv.push_back(Vector()); and m2.insert(PairVector("two", &vv.back())); statements.
Using solution 2) makes Valgring print: 10 allocs, 11 frees Is that OK?
As I'm not using new why should I delete?
Thanks, for any help!