访问冲突阅读位置:: set :: erase发生

问题描述:

我最近陷入我的应用程序下列崩溃:访问冲突阅读位置:: set :: erase发生

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,四字PTR [这](上坠毁)

所以我假设我们正在死去,因为坏的 “本”,因为它在该函数中第一次访问它。但是因为我看了当地人/汽车,这似乎不是一个糟糕的指针。

会很高兴得到提示。

+2

我认为你需要提供更多的信息。 – 2009-10-05 15:28:38

+0

请通过在调试器中显示错误显示来提供有关崩溃的更多信息。 – 2009-10-05 15:31:30

+0

声明和数组初始化会有很大的帮助。 – 2009-10-05 15:35:22

东西指向0.当您使用Visual Studio在调试模式下编译您的应用程序。键入Ctrl + Alt + E并在抛出异常时激活它们。这将帮助您在运行异常处理程序之前检测出现问题的地方。然后你可以发布这个callstack,但我想你会很容易的看到&自己解决问题。我可以想象任何类型的plr的析构函数都有什么坏处。

我认为这与plr比m_players已被删除或不可用更重要。你能告诉你如何得到plr吗?它是一个局部变量还是被作为参数传递?你可能想创建一个局部变量,然后在擦除函数中使用它并查看它是否崩溃。通过这种方式,您可以确定究竟是什么导致了崩溃。

+0

嗯是的,谢谢 – Guest 2009-10-05 16:19:11

任何机会数组是全局的,有问题的代码在数组被初始化之前执行(如果它的内部是全局对象的构造函数,就会发生)?

+0

hmm没有 顺便说一句,它崩溃(diassembly)000000014007AA3B mov rcx,qword ptr [this] – Guest 2009-10-05 19:10:50

使用Visual Studio时,始终确保运行时间是相同的。你有证实吗? (例如多线程调试DLL(/ MDd))