1. ホーム
  2. c++

[解決済み] Valgrindを使用してセグメンテーション障害の詳細を検出する方法は?

2022-02-06 18:19:34

質問内容

APIコールで初期化したstd::map< std::string, std::string> があるのですが、これは何ですか?このマップを使用しようとすると、segmentation faultが発生します。無効なコードを検出する方法、何が無効なのか、または問題を解決するのに役立つ詳細な情報を教えてください。コードは以下のようなものです。

std::map< std::string, std::string> cont;

some_func( cont ); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function

std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key"

解決方法は?

ブラケット演算子は常にstd::stringを返し(必要なら空の文字列を作成)、それは常に印刷に有効であるべきです。

その代わりに、あなたが見るコールスタックは次に実行される行を指していて、それがsome_funcで死んでいるという可能性はありませんか?そのコードが見えないので、それが問題を引き起こしている可能性があるかどうかは言えません。

別の方法としては some_func char* (invokes temp std::string) を使って、map の文字列を初期化することはできますか?それは、無効な文字列をマップに導入している可能性があり、しばらくは "たまたま動作"しますが、some_func が返ると print とうまく連動しません。