我最近在我的应用程序中遇到了以下崩溃:
m_players[0].erase(plr); -- CRASHES HERE
m_players[1].erase(plr);
m_players
声明为:
set<PlayerPointer> m_players[2];
Visual Studio 显示它是“0xC0000005:访问冲突写入位置 0x0000000000000024。”
编译器:Visual Studio 2008。
反汇编:000000014007AA3B mov rcx,qword ptr [this](崩溃)
所以我假设我们因为糟糕的“this”而死去,因为它是在那个函数中第一次访问 this。但自从我看了 locals/autos,这似乎不是一个坏指针。
很高兴得到提示。
最佳答案
某些东西指向 0。当您使用 Visual Studio 时,请在 Debug模式下编译您的应用程序。键入 Ctrl+Alt+E 并在抛出异常时激活异常。这将帮助您在运行异常处理程序之前检测出错的地方。然后您可以发布调用堆栈,但我认为您随后会很容易地看到并解决问题。我可以想象 plr 类型的析构函数中有什么不好的地方。
关于c++ - std::set::erase 上的访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520772/