15

我有一个 std::map< std::string, std::string> ,它通过一些 API 调用进行了初始化。当我尝试使用此地图时,我遇到了分段错误。如何检测无效代码或无效代码或任何可以帮助我解决问题的细节?代码如下所示:

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"
4

3 回答 3

4

您使用以下语法启动应用程序(以调试模式编译):

valgrind yourapp

Valgrind 将向您显示发生分段错误的堆栈回溯。之后,由您来查找发生的事情并进行纠正。

在您的代码中,无论 valgrind 是什么,我都会检查返回 cont[ "some_key" ]的最可能导致您的段错误的原因是返回的值是一些野指针或根本没有初始化。如果是这样,任何尝试访问它cont["some_key"][0]也会导致分段错误。

另一个想法:你的地图中的字符串键呢?是否有可能其中一些静默(无例外)未能分配用作键的字符串的数据部分。std::map 不是哈希表,而只是一些有序容器。当搜索一个键时,它可能需要访问其他键并且那里可能会发生一些事情。要检查您是否可以尝试迭代地图中的所有键并显示内容(查看“some_key”是否特别出现问题,或者您是否无法访问地图中的任何内容。

如果您的程序不需要排序以查看行为是否相同,您也可以尝试使用 unordered_map。

于 2010-04-21T14:32:33.440 回答
3

一般来说,我不确定该行如何产生段错误:括号运算符将始终返回一个 std::string (如果需要,创建一个空的)并且它应该始终对打印有效。

相反,您看到的调用堆栈是否可能指向要执行的下一行,并且它在 some_func 中死亡?我们没有看到它的代码,所以我不能说它是否会导致问题。

或者是some_func使用 char* (调用 temp std::string)来初始化地图中的字符串?它可能会在映射中引入一个无效的字符串,该字符串在一段时间内“正常工作”,但是当 some_func 返回时,它不能与打印很好地交互。

于 2010-04-21T15:01:06.567 回答
0

除了 valgrind,您还可以尝试使用调试器来专注于您的问题。

在行中设置断点some_func(cont),并检查是否cont为有效引用。

此外,您是否考虑过cont["some_key"]如果 some_key 不存在会返回什么?

于 2010-04-21T14:35:49.593 回答