0

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

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”而死去,因为它是在那个函数中第一次访问这个。但是因为我看了本地人/汽车,这似乎不是一个坏指针。

很高兴得到一个提示。

4

4 回答 4

2

有些东西指向 0。当您使用 Visual Studio 时,请在调试模式下编译您的应用程序。键入 Ctrl+Alt+E 并在抛出异常时激活它们。这将帮助您在运行异常处理程序之前检测出问题的地方。然后您可以发布调用堆栈,但我认为您将自己轻松地看到并解决问题。我可以想象 plr 类型的析构函数中有什么不好的地方。

于 2009-10-05T15:59:06.437 回答
1

使用 Visual Studio 时,最好确保运行时相同。你验证了吗?(例如多线程调试 DLL (/MDd))

于 2011-03-26T19:52:56.460 回答
0

数组是否有可能是全局的,并且在初始化数组之前执行有问题的代码(如果它在全局对象的构造函数内等可能发生)?

于 2009-10-05T18:41:45.017 回答
0

我认为这与 plr 有更多关系,而不是 m_players 已被删除或不可用。你能展示你如何获得plr,它是一个局部变量还是作为参数传递?您可能想要创建一个局部变量,然后在擦除函数中使用它并查看它是否崩溃。通过这种方式,您可以查明导致崩溃的确切原因。

于 2009-10-05T16:09:42.077 回答