当前位置:  开发笔记 > 编程语言 > 正文

为什么Valgrind声称我的std :: map <T,T>的实现会产生内存泄漏?

如何解决《为什么Valgrind声称我的std::map<T,T>的实现会产生内存泄漏?》经验,为你挑选了1个好方法。

Valgrind正在输出以下内容:

==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 > >::allocate(unsigned long, void const*) (new_allocator.h:92)
==14446==    by 0x41C4AB: std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_get_node() (stl_tree.h:357)
==14446==    by 0x41C915: std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_create_node(std::pair const&) (stl_tree.h:366)
==14446==    by 0x5036E9A: std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair const&) (stl_tree.h:852)
==14446==    by 0x5037027: std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert_unique(std::pair const&) (stl_tree.h:1148)
==14446==    by 0x5037227: std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert_unique_(std::_Rb_tree_const_iterator >, std::pair const&) (stl_tree.h:1188)
==14446==    by 0x50375CD: std::map, std::allocator > >::insert(std::_Rb_tree_iterator >, std::pair const&) (stl_map.h:496)
==14446==    by 0x50376DE: std::map, std::allocator > >::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(double) (ImageMatrix.h:48)

这可能意味着什么?

//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());

小智.. 5

这可能是因为池分配器.来自Valgrind FAQ:

我的程序使用C++ STL和字符串类.Valgrind报告在程序退出时涉及这些类的"仍然可达"的内存泄漏,但应该没有.

首先:放松,这可能不是一个错误,而是一个功能.许多C++标准库的实现都使用自己的内存池分配器.很多被破坏对象的内存不会立即被释放并返回给操作系统,而是保存在池中以供以后重复使用.池没有在程序的exit()处释放的事实导致Valgrind报告此内存仍然可以访问.不要在exit()处释放池的行为可以称为库的错误.

阅读更多: Valgrind Faq

我可能错了,因为我赶时间,我无法分析你的代码.



1> 小智..:

这可能是因为池分配器.来自Valgrind FAQ:

我的程序使用C++ STL和字符串类.Valgrind报告在程序退出时涉及这些类的"仍然可达"的内存泄漏,但应该没有.

首先:放松,这可能不是一个错误,而是一个功能.许多C++标准库的实现都使用自己的内存池分配器.很多被破坏对象的内存不会立即被释放并返回给操作系统,而是保存在池中以供以后重复使用.池没有在程序的exit()处释放的事实导致Valgrind报告此内存仍然可以访问.不要在exit()处释放池的行为可以称为库的错误.

阅读更多: Valgrind Faq

我可能错了,因为我赶时间,我无法分析你的代码.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有