¿Por qué está diciendo Valgrind que mi aplicación de std :: mapa produce una pérdida de memoria?
Pregunta
Valgrind está emitiendo el siguiente:
==14446== 2,976 (176 direct, 2,800 indirect) bytes in 2 blocks are definitely lost in loss record 23 of 33
==14446== at 0x4C2506C: operator new(unsigned long) (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==14446== by 0x41C487: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::allocate(unsigned long, void const*) (new_allocator.h:92)
==14446== by 0x41C4AB: std::_Rb_tree<unsigned, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn>, std::_Select1st<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::_M_get_node() (stl_tree.h:357)
==14446== by 0x41C915: std::_Rb_tree<unsigned, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn>, std::_Select1st<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::_M_create_node(std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> const&) (stl_tree.h:366)
==14446== by 0x5036E9A: std::_Rb_tree<unsigned, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn>, std::_Select1st<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> const&) (stl_tree.h:852)
==14446== by 0x5037027: std::_Rb_tree<unsigned, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn>, std::_Select1st<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::_M_insert_unique(std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> const&) (stl_tree.h:1148)
==14446== by 0x5037227: std::_Rb_tree<unsigned, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn>, std::_Select1st<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::_M_insert_unique_(std::_Rb_tree_const_iterator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> const&) (stl_tree.h:1188)
==14446== by 0x50375CD: std::map<unsigned, vimrid::imaging::ImageMatrixColumn, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::insert(std::_Rb_tree_iterator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> >, std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> const&) (stl_map.h:496)
==14446== by 0x50376DE: std::map<unsigned, vimrid::imaging::ImageMatrixColumn, std::less<unsigned>, std::allocator<std::pair<unsigned const, vimrid::imaging::ImageMatrixColumn> > >::operator[](unsigned const&) (stl_map.h:419)
==14446== by 0x5036A43: vimrid::imaging::ImageMatrixRow::operator[](unsigned) (ImageMatrixRow.cpp:10)
==14446== by 0x5034BBB: vimrid::imaging::ImageMatrix::_getRotatedCopy(double, vimrid::imaging::ImageMatrix&) (ImageMatrix.cpp:151)
==14446== by 0x503350A: vimrid::imaging::processing::ImageFilter& vimrid::imaging::ImageMatrix::GetRotatedCopy<vimrid::imaging::processing::ImageFilter>(double) (ImageMatrix.h:48)
¿Qué podría significar esto?
//ImageMatrixRow.cpp:8-11
ImageMatrixColumn &ImageMatrixRow::operator[](VUInt32 columnIndex)
{
return columns[columnIndex];
}
//ImageMatrix.cpp:151
target[x][y][0] = source[roundX][roundY][0];
//ImageMatrix.h:48
return *(T*)&_getRotatedCopy(degrees, CopyDimensions());
Solución
Es probable que sea debido a un asignador piscina. De Valgrind Preguntas:
Mi programa utiliza el STL C ++ y clases de cuerda. informa valgrind pérdidas de memoria '' sigue siendo alcanzables la participación de estas clases a la salida de el programa, pero no debe haber ninguno.
En primer lugar: relajarse, es probable que no un error, sino una característica. Muchos implementaciones de la norma el C ++ bibliotecas utilizan su propio bloque de memoria asignadores. Memoria para un buen número de los objetos no es destructed inmediatamente liberado y devuelto a el sistema operativo, pero se mantuvo en la piscina (s) de posteriormente re-uso. El hecho de que las piscinas No se liberan a la salida () de la programa de causar Valgrind para informar de esta la memoria como estando accesible. los comportamiento no a las piscinas gratis en el exit () se podría llamar un error de la aunque biblioteca.
Leer más en: Valgrind Faq
Puedo estar equivocado, ya que estoy en un apuro y no puedo analizar su código.
Otros consejos
No parece El error que venir de su código, pero una biblioteca que está utilizando.
Valgrind viene con cierta supresión de error por defecto, pero que probablemente no cubre la biblioteca que está utilizando.
Las herramientas de comprobación de errores detectan numerosos problemas en las bibliotecas de base, tales como la biblioteca de C de GNU, y las bibliotecas de cliente de X11, que vienen pre-instalados en su sistema GNU / Linux. No se puede arreglar fácilmente estos, pero no desea ver estos errores (y sí, hay muchos!) Así que Valgrind lee una lista de errores para suprimir en el arranque. Un archivo de supresión por defecto es creado por el script ./configure cuando el sistema está construido.
Usted puede crear su propia que sabe que son irrelevantes para su código.
Vea la cuestión de forma parecida ¿Por qué le gusta mi Valgrind el uso de glutCreateWindow?