我有一个 std::map< std::string, std::string> ,它通过一些 API 调用进行了初始化。当我尝试使用此 map 时,我遇到了段错误。如何检测无效代码或无效代码或任何可以帮助我解决问题的细节?代码如下所示:
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"
最佳答案
您使用以下语法启动您的应用程序(在 Debug模式下编译):
valgrind yourapp
Valgrind 将向您显示发生段错误的堆栈回溯。之后,由您来查找发生的事情并进行纠正。
在您的代码中,无论 valgrind 是什么,我都会检查返回的内容 cont[ "some_key"]
您的段错误的最可能原因是返回的值是一些野指针或根本没有初始化.如果是这样,任何尝试像 cont["some_key"][0]
一样访问它也会导致段错误。
另一个想法:你的 map 中的字符串键怎么样?是否有可能其中一些静默(无异常(exception))未能分配用作键的字符串的数据部分。 std::map 不是哈希表,而只是一些有序容器。当搜索一个键时,它可能需要访问其他键并且那里可能会发生一些事情。检查您是否可以尝试迭代 map 中的所有键并显示内容(查看“some_key”是否特别出现问题,或者您是否无法访问 map 中的任何内容。
如果您的程序不需要排序来查看行为是否相同,您也可以尝试使用 unordered_map。
关于c++ - 如何使用 Valgrind 检测段错误细节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2683778/