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[] 会创建一个对象?