访问冲突读取位置0x00000002 [关闭]

Posted

技术标签:

【中文标题】访问冲突读取位置0x00000002 [关闭]【英文标题】:Access Violation reading location 0x00000002 [closed] 【发布时间】:2014-01-23 00:39:39 【问题描述】:

我的代码出现以下错误:

CChatClient.exe 中 0x00b09736 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000002。

我无法发布整个代码,所以粘贴错误出现的部分代码..

> static void run_thread(void *args)
    
        CThreadRunnable *pRunnable = static_cast<CThreadRunnable*>(args);
        int* actual_arg = (int *)args;
        if (*actual_arg)
        
            PRINTD "value of arg=" << *actual_arg << std::endl;
            pRunnable->run(actual_arg);
        
    

在运行时异常即将到来的第 5 行。 我无法在 Visual Studio 10 上调试此错误。 有人可以帮忙,如何在 Visual Studio 编译器上调试这种错误。

谢谢, 拉文德拉古普塔

【问题讨论】:

在此处添加导致此错误的代码。 看起来像一个空指针。虽然这就是我能说的没有代码的全部内容。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括有效的代码来重现它。有关指导,请参阅 SSCCE.org。 你能发布你创建线程的代码吗? 您的代码没有多大意义。 args 指向 CThreadRunnable,或者它指向 int - 它不能同时是两者。然而你继续往两个方向投射。 【参考方案1】:
if (*actual_arg)

如果此行导致错误,则 actual_arg 为 2,您尝试将其作为指针处理并取消引用。不允许偷看2的内存地址,导致访问冲突。

猜猜,我会说你将变量而不是地址传递给函数。

编辑:

你的签名错了。

static void run_thread(void *args)

Correct 会是

static DWORD run_thread(void* args)

【讨论】:

HAN​​DLE hThreadHndr = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)&CChatClient::run_thread, (LPVOID)SEND, 0, NULL);这就是我调用 run_thread 的方式。 @Ravindra 如果你必须投,那你就错了。【参考方案2】:

转到调试->异常。检查两个复选框的“系统运行时异常”(名称可能是其他东西,我不记得确切的名称)。

【讨论】:

这是做什么的?这对 OP 有何帮助?为什么 OP 应该这样做? "有人可以帮忙吗,如何在 Visual Studio 编译器上调试这种错误。"如果位置未知,这正是调试崩溃的方法。问题由 OP 编辑​​。

以上是关于访问冲突读取位置0x00000002 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]

0x00840bd7 处的访问冲突:读取地址 0x00000000'。过程......(5644)“ [关闭]

使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0

访问冲突读取位置 0x00000000 cstrings

C++ + OpenCV = 访问冲突读取位置 0x02176000

使用 memcpy 时出错:“访问冲突读取位置 0x0000000000000000”