Bueno, soy muy nuevo en Valgrind y en los perfiladores de pérdida de memoria en general. Y debo decir que da un poco de miedo cuando empiezas a usarlos porque no puedes dejar de preguntarte cuántas fugas podrías haber dejado sin resolver antes.¿Está loco Valgrind o se trata de una pérdida de memoria de iterador de mapa estándar genuino?
Hasta el punto, como no tengo experiencia en el programador de C++, me gustaría comprobar si esto es sin duda una pérdida de memoria o es que Valgrind está haciendo un falso positivo?
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();
¿Por qué es eso? ¿No debería el comando claro llamar al destructor de cada objeto y cada vector?
Ahora después de hacer algunas pruebas I conocer diferentes soluciones para la fuga:
1) Eliminando:
i->second->push_back(10);
2) Adición de:
delete i->second;
3) Eliminación de la segunda
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
Usando la solución 2) hace que Valgring imprima: 10 allocs, 11 libres ¿Está bien?
Como no estoy utilizando nuevos, ¿por qué debería eliminar?
¡Gracias por cualquier ayuda!
No utilice las comillas de bloques para formatear el código, use el icono 101010 (o Ctrl + K). –
Editado para formato de código. – Gorpik
El uso de typedefs me ha dejado el código incomprensible. –