Linux与Windows的c++差异:std::map

C++ Differences between Linux and Windows with std::map

本文关键字:std map 差异 c++ Windows Linux      更新时间:2023-10-16

我试图使用std::map来保存配置细节,但是我在Windows (Windows 8 64位)和Linux (Ubuntu 12.04 64位)之间得到不同的行为

下面是代码片段:
std::map<std::string, std::string> testMap;
testMap.insert(std::pair<std::string, std::string>("test1", "value1"));
testMap.insert(std::pair<std::string, std::string>("test2", "value2"));
std::cout << testMap["test1"] << std::endl;

在windows上,这将返回预期的"value1",但是在Linux上,这会导致Seg Fault。

谁能给我指个正确的方向?

上面的代码很好,在Linux机器上可以正常工作。您已经提到,在访问该行时,您正在获得分段错误,这表明您的程序的其他逻辑正在进行某种内存损坏。

std::cout << testMap["test1"] << std::endl;

堆损坏通常是在进程中加载的一些DLL/模块已经发生真正的损坏之后检测到的,当前逻辑(程序崩溃的地方)可能是受害者。然而,由于在Linux机器上观察到这个问题,您可能希望使用Valgrind。这是你应该附加你的程序(a.out)的方式。

$ valgrind --tool=memcheck --db-attach=yes ./a.out
当程序检测到内存错误时,

Valgrind将在调试器中附加程序(自动),以便您可以进行实时调试(GDB)。这样你就能找到问题的根本原因。