在 0x00007FF93E507A7A (ntdll.dll) 处抛出异常。访问冲突读取位置 0xFFFFFFFFFFFFFFFF

Exception thrown at 0x00007FF93E507A7A (ntdll.dll) .Access violation reading location 0xFFFFFFFFFFFFFFFF

我正在使用 POCO 库来工作网络。 我使用 JSON 的 POCO/JSON 数据。我的代码:

User user(context.marshal_as<std::string>(tbUserName->Text),
        context.marshal_as<std::string>(tbFullName->Text),
        context.marshal_as<std::string>(tbDisplayName->Text),
        context.marshal_as<std::string>(tbEmail->Text),
        context.marshal_as<std::string>(tbPhoneNumber->Text),
        context.marshal_as<std::string>(tbNamSinh->Text),
        context.marshal_as<std::string>(tbPassword->Text),
        context.marshal_as<std::string>(tbConfirm->Text)
    );
    string jsonString = user.serialize();

我在 Client_Winform.exe 中的 0x00007FF93E507A7A (ntdll.dll) 处抛出了错误异常:

0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

如果有这个异常的处理程序,程序可以安全地继续。

您正在使用从某个函数返回为 INVALID_HANDLE 的句柄(INVALID_HANDLE 是 -1 或 0xFFFFFFFFFFFFFFFF)。当您尝试使用它时,它被用作一个地址,您没有访问该地址的权限(错误 5 是访问冲突)。

使用 Visual Studio 的代码分析来跟踪代码中错误所在的确切位置。 https://msdn.microsoft.com/en-us/library/ms182028.aspx 这些错误信息的问题不在于理解原因(处理不当),而在于找到地方。因为你的代码没有错误地通过了编译,而且在很多情况下,运行 会在几台机器上顺利地运行并且只在其中一台机器上崩溃,所以你需要关注崩溃的地方。

当您拥有多平台项目(即程序集)时,可能会发生这种情况。也就是说,如果您有一个 x86 项目和另一个 x64 项目。在错误的平台下构建项目时会出现问题。例如,在 x86 下引用 x64 程序集构建,并且在消费者代码中尝试调用特定函数。因为,对于这种混合平台程序集,参考计算导致 x00000005 或 xFFFFFFFF 类型的位置,这是侧 RAM 中的限制区域(即 OS 部分)。因此,它会抛出带有“访问冲突异常读取位置...”之类消息的异常。我找到的解决方案是确定准确的平台并将其应用于相关项目。我再次从回购中检索了全新的代码并在特定平台下构建,这个问题消失了。