我最近在我的应用程序中遇到了以下崩溃:
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。
Diassembly:000000014007AA3B mov rcx,qword ptr [this](坠毁)
所以我假设我们因为“这个”不好而死了,因为它是该函数的第一次访问。但是因为我看了本地人/汽车,所以这似乎不是一个糟糕的指针。
很高兴获得提示。
答案 0 :(得分:2)
有些东西指向0.当您使用Visual Studio在调试模式下编译应用程序时。键入Ctrl + Alt + E并在抛出异常时激活它们。这将帮助您在运行异常处理程序之前检测出错的位置。然后您可以发布callstack,但我认为您将自己轻松地看到并解决问题。我可以想象在任何类型的析构函数中都有一些不好的东西。
答案 1 :(得分:1)
使用Visual Studio时,始终确保运行时是一样的。你验证了吗? (例如,多线程调试DLL(/ MDd))
答案 2 :(得分:0)
我认为这与plr有关,而m_players已被删除或不可用。你能说明你是如何获得plr的,它是局部变量还是作为参数传递?您可能想要创建一个局部变量,然后在擦除功能中使用它,看它是否崩溃。通过这种方式,您可以确定导致崩溃的确切原因。
答案 3 :(得分:0)
数组是否是全局的,并且在初始化数组之前执行有问题的代码(如果它在全局对象的构造函数中,可能会发生)?