c++ - std::set::erase 上的访问冲突读取位置

标签 c++ access-violation stdset

我最近在我的应用程序中遇到了以下崩溃:

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/

相关文章:

java - SWIG 和异常 : avoid using throw(Exception) in C++

c++ - 从 Delphi 使用 C++ DLL 时出现 AccessViolation

c# - .NET Framework 4.5 或更高版本中的 AccessViolationException

C++ memcpy 和愉快的访问冲突

C++:如果使用自定义类(而不是指针),则 std::map 和 std::set 不会排序

c++ - 在 std::set 容器中使用常量字符指针:内存消耗

c++ - C++ 中的异常类不起作用

c++ - 使用共享变量的线程

c++ - 如何在 moc 文件中使用级联命名空间?

c++ - 是否有 O(1) 方法将 std::map<keytype, value> 转换为 std::set<keytype>