私は2つの作業環境を持っています:
- VirtualBox に Debian を搭載したラップトップ
- 同じバージョンの Debian が正常にインストールされている PC
一部の H/W は VB で動作しないため、2 つのシステムを使用しています。プロジェクトには、pthread と ncurses の使用が含まれます。
突然、PC で seg-fault エラーが発生しましたが、同時にラップトップ + VB ではすべて正常に動作しています。エラーは、pthreads または ncurses のいずれにも接続されていません。Eclipse を使用してソフトウェアを開発しています。プロジェクトを移行する手順は次のとおりです。
- ラップトップから USB ドライブにファイルをコピーする
- プロジェクトを PC の Eclipse ワークスペースにインポートする
今まではすべて問題ありませんでした。ツールチェーンの設定はどちらも同じようです。
コード:
Config::~Config() {
std::map<std::string, Setting*>::iterator configIterator;
for(configIterator = config.begin(); configIterator != config.end(); ++configIterator){
delete configIterator->second;
}
config.clear();
}
delete演算子に seg-fault が表示されます。delの前にオブジェクトの存在を確認すると、すべてメモリ内にあるように見えます。
これは設定エントリを追加する方法です:
config.insert(std::pair<std::string,Setting*>("language", new Setting("en_en")));
私の質問は二重です:
- -O0 でも値を最適化したのはなぜですか?
- なぜこれが起こっているのかを見つけるために何を探すべきですか?
これがメモリの割り当てまたは割り当て解除であることはわかっていますが、どこから始めればよいかさえわかりません。エラーのあるコードの一部を削除しようとしましたが、これにより、不明な場所でさらにエラーが発生しました。
[編集] 以下の @コメント:
実際のエラーは to-string キャスト演算子のオーバーロードされたメソッドにあることがわかりましたが、:
Setting::operator std::string(){
std::stringstream sstr;
switch(what){
case STRING: sstr << str; break;
case INT: sstr << i; break;
case FLOAT: sstr << f; break;
default: sstr << str; break;
}
sstr << std::flush;
return sstr.str();
}
>> return "x" << のようなダミー文字列のみを返すようにこれを変更すると、seg-fault はありません。では、上記のコードの何が問題なのですか? そして、これがVBでは機能するのにPCでは機能しない理由.