2011-09-17 18 views
1

私はSampleという名前のクラスを持っています。このクラスには、std::stringのパラメータvalueが含まれています。 公開メンバ関数setValue(std::string tempdata)があり、このメンバの値を設定します。std :: stringの割り当て中にセグメンテーションフォルトが発生する

void Sample::setValue(std::string tempdata) { this->value= tempdata; } 

このパラメータの値を設定する必要があります。私はプログラムがクラッシュしたアプリケーションを実行すると、GDBを通してそれをデバッグする上で、私が得るとき

std::string tempvalue = "Hello"; 
Sample s; 
s.setValue(tempvalue); 

: は、私のような何かを

#0 0x049da761 in __gnu_cxx::__exchange_and_add() from /usr/lib/libstdc++.so.6 
#1 0x049c0e6e in std::string::assign() from /usr/lib/libstdc++.so.6 
#2 0x049c0ed1 in std::string::operator=() from /usr/lib/libstdc++.so.6 
#3 0x08075e9b in Sample::setValue (this=0x83779a8, tempdata=Cannot access memory at address 0xffffffff) 

誰もが、私はこの問題をデバッグするに取り掛かるべきか提案してくださいことはできますか?

+1

コードは正常です。それを含むファイルを再コンパイルせずにヘッダファイルを修正しましたか? (例えばMakefileで作業していて、これらのターゲットが定義されている場合は 'make clean'を実行してから' make'を実行してください) –

+1

これはgccの内部問題のようです。http://stackoverflow.com/questions/ 7038124/weird-sigsegv-segmentation-fault-in-stdstringassign-method-from-libstdc。 –

答えて

2

あなたが示したコードは正しいです。だから、エラーはどこかにある。これは、例えば、これらのコード行が実行されるまで気付かれていない、いくつかのより早い時点でのスタックまたはヒープ破損である可能性があります。

+2

スタックトレース中の 'tempdata'は' 0xffffffff'です。これは非常に珍しいことです。少なくとも、上に貼り付けられたコードの場合です。 –

+0

このコードは、実行しようとしているより大きなアプリケーションの一部です。クラスメンバに値を代入しようとすると、この時点でコードがクラッシュするだけです。私はこれがヒープまたはスタックの破損かもしれないが、そのような大きなアプリケーションでそれを探す方法と0xffffffffが重要な何かを示すことに同意しますか? - Amit – Amit

+1

これは、誰かがある時点でメモリのこの部分に値 '0xffffffff'を書き込んだことを示しています。 ;)私は@クリスのポイントは、それはよく見られる価値ではないということです。より一般的には、一度有効な(一度解放されたメモリのブロックを指している)ポインタや、デバッグビルドでは、 '0xcdcdcdcd'や' 0xdeadbeef'などの特殊な値や、初期化されていないまたは解放されたメモリ。 '0xffffffff'は、データまたはコードへのポインタではない点で重要です。だから、誰かがあなたの 'tempdata'ポインタの上に非ポインタデータを書きました。 – jalf

関連する問題