¿Por qué está diciendo Valgrind que mi aplicación de std :: mapa produce una pérdida de memoria?

StackOverflow https://stackoverflow.com/questions/766080

  •  12-09-2019
  •  | 
  •  

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());
¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top