2011-01-01 16 views
2

簡単なC++/valgrind質問私は誰かが助けてくれることを望んでいます。valgrind&C++:文字バッファからstd :: stringを構築する

次のコードに対するvalgrindのを実行しているとき、私ははstdに関連する2つの可能なリークを取得する::文字列:

==10325== 17 bytes in 1 blocks are possibly lost in loss record 1 of 2 
==10325== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255) 
==10325== by 0x40CFD05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D0B10: ??? (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D0CF5: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x804872B: main (test.cc:9) 
==10325== 
==10325== 17 bytes in 1 blocks are possibly lost in loss record 2 of 2 
==10325== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255) 
==10325== by 0x40CFD05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D0977: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D17AC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D1C7F: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x40D1D63: std::string::operator+=(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==10325== by 0x804879D: main (test.cc:11) 

それらを抑制するためにあまりにも多くの仕事ではないでしょう、そしてコードは十分に簡単思えますが私には、私が何をしているかを知っていることをバングラデントに知らせる前に、私がここで何かを見逃していないことを確認したいと思います。 exit()を呼び出してプログラムを終了

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
     char buffer[8192]; 
     sprintf(buffer, "ABCD"); 
     std::string str(buffer); 
     std::string str2 = ""; 
     str2 += str; 
     exit(EXIT_SUCCESS); 
} 

答えて

7

は、それが基本的に現在の場所でプログラムを中止し、実際に正常なシャットダウンではありません。したがって、strstr2はプログラムの終了前に破壊されず、valgrindがそれを拾い上げます。

メインから戻るだけでプログラムを正常に終了すると、strstr2のデストラクタが呼び出され、報告された「メモリリーク」がなくなるはずです。あなたはlibstdc++(標準C++ Linuxや一部のBSD用のライブラリ)を使用している場合、あなたはvalgrindのに漏れがないように見えるstd::stringメモリプールの最適化を、無効にするには、GLIBCXX_FORCE_NEWであなたのプログラムをコンパイルする必要があること

+0

+1良いキャッチ! – wilhelmtell

+0

確かに。どうもありがとう! – cubic1271

6

も注意してください。あなたのリリースビルドのためにそれをオフに戻すことを忘れないでください:-)。

関連する問題