2011-07-26 14 views
3

私は何ヶ月もセグメンテーションフォルトに苦しんでいますが、今私は助けを求めるためにここにいます。 セグメンテーションフォールトは、私は、GDBを使用して、以下の機能セグメンテーションフォールトstd :: map :: clearを呼び出す

void foo(..., std::map<MyClass*, double> & x) { 
if (!x.empty()) x.clear(); 
... 
} 

Class A { 
private: 
map<MyClass*, double> _N; 
public: 
void f(...) { 
foo(..., _N); 
... 
} 
}; 

//in main routine, the function is called in a loop 
A a; 
while(...) { 
a.f(...); 
} 

を呼び出すときに、私は明確に()関数を呼び出す行にエラーを留め、それは「二重解放や破損」エラーを示しており、プログラムがで中断されます表示されますC++/4.1.2/ext/new_allocator.h:94 delete(__ P)を呼び出して、gnuライブラリ/lib64/libc.so.6からfree()を呼び出します。しかし、マップ内の要素はnewによって割り当てられていないので、まだそれをクリアするためにfree()を呼び出すのはなぜですか?私はあなたのコメントを本当に感謝します。ありがとうございました。

+0

エラーは別の場所にある必要があります。とにかくマップが空であるかどうかに関係なく、 'clear()'を呼び出すことができます。周囲のコードをもっと見せてください。 –

+1

値でマップを渡すとどうなりますか、プログラムのセマンティクスは間違っていますが、segf 'ですか? – 111111

+1

は、ヒープ上に割り当てられた 'foo'へのパラメータとして渡されるオブジェクトですか?もしそうなら、それは以前に割り当てられていなかった(または他の場所に移動した)可能性はありますか? –

答えて

1

コードはわかりやすく表示されます。少なくともあなたが提供した文脈は限られています。通常、私がこのような問題に遭遇したとき、私はvalgrind memcheckツールを実行して、最初に "削除"された場所を見つけます。一度それを知っていれば、これらの問題は非常に簡単に解決することができます。

2

マップが別のオブジェクトによって所有されている場合、クリアが呼び出されたときにマップ所有オブジェクトが既に削除されていることが疑わしいと脅かされます。

また、アンダースコアと大文字で始まる名前は実装用に予約されているため、使用することはできません。

関連する問題