2009-04-19 53 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のは の出口のプログラムでこれらのクラスを含む 「まだ到達可能」メモリリーク を報告しますが、 何があってはなりません。

まず:リラックス、それはおそらくバグ ではないが、機能。多くの C++標準の実装では、 ライブラリは、独自のメモリプール アロケータを使用します。破壊オブジェクトのかなりの数 のためのメモリはすぐに解放され、バック にOSを与え ではありませんが、 後の再使用のためにプール(複数可)に保管しました。 が プログラムの終了()で解放されていないプールがValgrindのはまだ到達可能として、この メモリを報告させるという事実。 exit()でプールを解放しないという動作は、 ライブラリのバグと呼ばれる可能性があります。

で続きを読む: Valgrind Faq

私は急いで、私は、間違っている可能性があり、私はあなたのコードを分析することはできません。

1

エラーは、コードから来ているように見えるが、あなたが使用しているライブラリはありません。

Valgrindのは、いくつかのデフォルトエラー抑制が付属していますが、それはおそらくあなたが使用しているライブラリをカバーしていません。

エラーチェックツールは、GNU CライブラリやGNU/LinuxシステムにプリインストールされているX11クライアントライブラリなど、ベースライブラリの多くの問題を検出します。これらのエラーを簡単に修正することはできませんが、これらのエラーは見たくありません(そうですが、多くあります)ので、起動時にエラーを表示するValgrindが表示されます。デフォルトの抑制ファイルは、システム構築時に./configureスクリプトによって作成されます。

自分のコードには関係のない独自のerror suppressionsを作成できます。

Why does Valgrind not like my usage of glutCreateWindow?

関連する問題