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

时间:2009-10-05 15:27:05

标签: 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。

Diassembly:000000014007AA3B mov rcx,qword ptr [this](坠毁)

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

很高兴获得提示。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用Visual Studio时,始终确保运行时是一样的。你验证了吗? (例如,多线程调试DLL(/ MDd))

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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