2009-04-19 49 views
3

Valgrind是輸出如下:爲什麼Valgrind指出我執行std :: map <T, T>會產生內存泄漏?

==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) 

什麼能這可能意味着什麼?

//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常見問題解答:

我的程序使用C++ STL和 字符串類。 Valgrind報告 '仍然可以'內存泄漏 涉及這些類在 程序的退出,但應該有 沒有。

首先:放鬆一下,這可能不是 的一個bug,而是一個功能。許多 實現的C++標準 庫使用它們自己的內存池 分配器。對於相當數量的內存 被銷燬的對象不是 立即釋放並返回到 的操作系統,但保留在池中以供後續重新使用 。在 程序的exit()池中沒有釋放池 這一事實會導致Valgrind將此內存報告爲仍可訪問。 行爲不釋放 exit()中的空閒池可能會被稱爲 庫的一個缺陷。

更多詳情: Valgrind Faq

我可能是錯的,因爲我在趕時間,我無法分析代碼。

1

錯誤似乎不是來自您的代碼,而是您正在使用的庫。

Valgrind帶有一些默認的錯誤抑制功能,但可能不包括您正在使用的庫。

錯誤檢查工具檢測基本庫(如GNU C庫和X11客戶端庫)中的許多問題,這些庫預先安裝在GNU/Linux系統上。你不能輕易修復這些錯誤,但你不想看到這些錯誤(是的,有很多!)因此,Valgrind讀取了一系列錯誤以在啓動時取消。系統建立時,默認的壓縮文件由./configure腳本創建。

您可以創建自己的error suppressions,這與您的代碼無關。

查看相似的問題Why does Valgrind not like my usage of glutCreateWindow?