程序在wstringstream行崩溃,wmTranslation无对应msg该如何修复?
故障修复方案
根因分析
你遇到的崩溃是由std::map的[]运算符的隐式插入特性导致的:当查找的Msg值不在wmTranslation的预设key列表中时,[]会自动向map中插入一条{Msg, nullptr}的新记录,最终返回的translatedMessage是空指针。后续wstringstream尝试输出空C字符串时触发非法内存访问,直接导致程序崩溃。
修复代码
修改TranslateMessage函数的查找逻辑,使用find方法做无插入的安全查找即可:
const char* TranslateMessage(int Msg) { static std::map<int, const char*> wmTranslation = { {0, "WM_NULL" }, {1, "WM_CREATE" }, {2, "WM_DESTROY" }, //... 剩余映射条目保持不变 }; auto iter = wmTranslation.find(Msg); if (iter != wmTranslation.end()) { return iter->second; } return "Unknown message"; }
补充说明
- 修复后即使传入未定义的
Msg值,也会返回合法的字符串常量指针,不会再触发空指针访问崩溃 - 如果你的编译环境支持C++20,也可以用
wmTranslation.contains(Msg)先判断key是否存在,再通过[]取值,但find是全版本兼容的最优方案
内容的提问来源于stack exchange,提问作者user16872085
相关产品推荐
相关产品推荐

