gpt4 book ai didi

c - 在 EnterCriticalSection() 上抛出的访问读取冲突

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:16 24 4
gpt4 key购买 nike

我正在开发一个多线程应用程序,它使用关键部分来同步一组实体。该数组保存在一个结构中,如下所示。 pe 数组的每个成员都包含自己的 criticalSection,它总是在访问该成员之前声明(我已经检查了它们)。

struct PlayerEntity {
DWORD state;
BOOL onScreen;
DWORD team;

DWORD_PTR baseAddr;
BOOL valid;
CRITICAL_SECTION critSec;
};

struct EntityList {
DWORD count;
PlayerEntity pe[128];
};

EntityList *getStaticEntityList() {
static EntityList entityList;
return &entityList;
}

启动应用程序后,两个线程中的一个会在尝试进入临界区时随机抛出异常(如下)。

Exception thrown at 0x00007FFC8813E7C5 (ntdll.dll) in RustExp.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

我假设此错误是由试图访问其 DebugInfo 对象的临界区对象引发的,因为每个对象的 DebugInfo 指针在初始化后都指向 0xffffffffffffffff。然而,在错误检查之后,它们都指向 0xcdcdcdcdcdcdcdcd。

我试图查找有关临界区对象及其成员的信息,但我似乎无法找到有关它们的任何信息。所以我问,初始化的临界区对象是否应该将其 DebugInfo 指向 0xffffffffffffffff 以及临界区何时尝试访问其 DebugInfo(从而引发读取错误)?

注意:这是在 Windows 10 上运行。

最佳答案

我错误地取消了我的评论。但无论如何,我进行了检查,发现 DebugInfo 指针在关键部分初始化期间被初始化为一个有效地址,该地址在所有测试(进入和离开该部分)期间保持不变。

如果你在关键部分初始化期间没有任何错误,它应该被正确初始化,因此你不能在那里有 0xFFFFFFFFFFFFFFFF

这只能得出一个结论,必须在代码其他地方发生的内存损坏中寻找问题。

关于c - 在 EnterCriticalSection() 上抛出的访问读取冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com