2009-09-14 11 views
6

特定のオフセットで文字列を含むstd::vector<uint8_t>があります。std :: string :: assign()によってsegfaultが発生する

... 
@128 00 00 00 00 00 00 00 00 73 6F 6D 65 74 68 69 33 ........somethin 
@144 38 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ng.............. 
@160 00 00 00 00 00 00 00 00 31 2E 32 2E 33 00 00 00 ........1.2.3... 
@176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
... 

私がデータを抽出しようとしている136をオフセットし、std::stringにそれを置く:ここ短縮ダンプだ

std::string x; 
x.assign(vec.begin()+136, vec.begin()+168); 

このしかし、私のアプリケーションは、セグメンテーションフォールトが発生します。今、私はLinuxでのソフトウェア開発ではかなり新しいんだけど、私はGDBに私のアプリを起動し、バックトレースを取得する方法を知っていますし、ここで問題を突き止め:200を返しても、以上のループvec.size()

(gdb) backtrace 
#0 0xb7536d78 in ??() from /lib/i686/cmov/libc.so.6 
#1 0xb7538cd5 in malloc() from /lib/i686/cmov/libc.so.6 
#2 0xb7708957 in operator new(unsigned int)() from /usr/lib/libstdc++.so.6 
#3 0xb76e4146 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&)() from /usr/lib/libstdc++.so.6 
#4 0xb76e63b0 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int)() from /usr/lib/libstdc++.so.6 
#5 0xb76e654a in std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int)() from /usr/lib/libstdc++.so.6 
#6 0x0806d651 in std::string::_M_replace_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0xbfffe464, __i1=..., __i2=..., __k1=..., __k2=...) at /usr/include/c++/4.3/bits/basic_string.tcc:637 
#7 0x0806d26e in std::string::replace<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:1390 
#8 std::string::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (
    this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:958 
#9 myclass::somemethod (this=0x811c730, vec=...) at myclass.cpp:135 

印刷ベクトルとデータを印刷すると問題は発生しません(ちょうどクラッシュスニペットの上に!)。

私はDebianでg ++ 4.3.4でコンパイルしています。この問題が何であるかの指針は?

答えて

13

あなたのコードのどこか他の場所で、これまでに症状が遅れています。解放されたメモリを使用すると、オペレーティングシステムは自由に見える限り継続して自由に使用できます。

valgrindでプログラムを実行してみてください。 valgrindは独自のmallocとfreeを使用するため、間違ったニュースや削除を警告することができます。 compile without optimisationsに確認し、-g と:

g++ -g main.cc -o binary 
valgrind --leak-check=full ./binary 

あなたがスコープの外に出るスタック変数からポインタを作成しないようにしてください。たとえば、これは新しい開発者の間でよくある間違いです:スコープの外に出ていたよう

int *foo() { 
    int a = 0; 
    // do something to a here 
    return &a; 
} 

、あなたは解放されたメモリへのポインタを返すされています。


について-g、マンページから:オペレーティングシステムのネイティブフォーマット(スタブ、COFF、XCOFF、またはDWARF 2)でデバッグ情報を生成。 GDBはこのデバッグ情報を処理できます。

+0

メモリはすでにベクターに入っているので、問題は新しい/削除の不一致にあるとは思えません。 –

+0

面白いのは、valgrindで実行した場合、segfaultは発生しないということです。 –

+0

具体的な内容に深く関わっていないため、存在しないaddrinfo構造を削除しようとしていました。私はfreeaddrinfo()を呼び出していましたが、ポインタをNULLに設定していないので、同じメモリをもう一度試して削除する必要がありました。 –

関連する問題