访问冲突读取位置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)
【讨论】:
HANDLE 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