私は何ヶ月もセグメンテーションフォルトに苦しんでいますが、今私は助けを求めるためにここにいます。 セグメンテーションフォールトは、私は、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()を呼び出すのはなぜですか?私はあなたのコメントを本当に感謝します。ありがとうございました。
エラーは別の場所にある必要があります。とにかくマップが空であるかどうかに関係なく、 'clear()'を呼び出すことができます。周囲のコードをもっと見せてください。 –
値でマップを渡すとどうなりますか、プログラムのセマンティクスは間違っていますが、segf 'ですか? – 111111
は、ヒープ上に割り当てられた 'foo'へのパラメータとして渡されるオブジェクトですか?もしそうなら、それは以前に割り当てられていなかった(または他の場所に移動した)可能性はありますか? –