std::map::operator[] 在 Windows 上违反访问内存

Posted

技术标签:

【中文标题】std::map::operator[] 在 Windows 上违反访问内存【英文标题】:std::map::operator[] Violation access memory on windows 【发布时间】:2015-12-08 15:41:50 【问题描述】:

我的一个项目遇到了一个大问题。这个项目是跨平台的。 它在 Linux 上工作得很好,但在 Windows 上,我在填充地图时有一个 Violation access memory。

我的 main.cpp 看起来像这样:

Server *s = new Server;

s->init(4253);

服务器.CPP:

this->_commandManager.addFunction(C_CREATEROOM, &Server::createRoom);
this->_commandManager.addFunction(C_JOINROOM, &Server::joinRoom);
this->_commandManager.addFunction(C_LAUNCHGAME, &Server::createGame);

最后是我的 CommandManager:

bool CommandManager::addFunction(E_COMMAND type, bool (Server::*cmd)(ANetwork::t_frame frame, void *data))

  _commands[type] = cmd;

  return true;

_commands 是 std::map<E_COMMAND, bool (Server::*)(ANetwork::t_frame, void*)> 的类型

将 cmd 添加到 _commands[type] 在 Linux(ubuntu 和 opensuse)上运行良好,但在 VS Entreprise 2015 的 Windows 10 上抛出 Violation Access Memory。

【问题讨论】:

顺便说一句,使用所有大写的常量是反模式 这是一个枚举。不是常数 没关系,大写标识符用于宏(这样习惯从 C 到 C++),你的常量或枚举很有​​可能会发生冲突,在最好的情况下你不会明显的编译错误,在最坏的情况下很难捕捉运行时错误。 哦,好的,谢谢 :) 我不知道!看到您的评论后,我更改了所有枚举! 【参考方案1】:

如果您使用的是 VS,请尝试在编译器中使用 /vmg 选项。

【讨论】:

以上是关于std::map::operator[] 在 Windows 上违反访问内存的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::map::operator= 与初始值设定项列表一起使用

如果键不存在,为啥 std::map operator[] 会创建一个对象?

高通:以Wi-Fi 7突破Wi-Fi性能极限

朴素贝叶斯算法

IEEE Fellow 张大庆:6G 时代, Wi-Fi 不再是 Wi-Fi

Wi-Fi Direct 和 iOS 支持