C ++访问冲突读为什么?

时间:2012-01-19 19:38:34

标签: c++ winsock access-violation

我正在开发应用程序,它将使用C ++ / Winsock通过pop / imap协议从服务器获取邮件。

原因,代码很大,粘贴在这里,我给你关于pastebin的链接:
http://pastebin.com/uCKcTQsj

它没有任何编译器错误,因此可以很好地进行复制。

我得到了不同的工作成果,有时一切正常,但我常常得到结果:

alex.exe中0x773f15de(ntdll.dll)的未处理异常:0xC0000005:
访问冲突读取位置0x00648000。

为什么我会得到不同的工作结果(通常是导致访问违规,但有时会有效)?

有没有办法捕获和处理违规异常(可能来自较低的严密性环,据我所知,这些异常是从本机模式的ntdll.dll抛出)来解决这个问题?

谢谢,最好的问候!

2 个答案:

答案 0 :(得分:2)

访问冲突意味着您正在访问尚未分配给您的应用程序的内存。

您会获得随机成功/失败,因为有时您尝试访问的内存将分配给您的应用程序,有时它不会。

无论哪种方式,问题在于您尝试访问尚未malloc ed(或new ed)的内存。即你试图取消引用/写入/读取“悬空”或“狂野”指针,或者你试图读取/写入超出内存块边界的正确分配的指针指向。

答案 1 :(得分:2)

您的标头结构包含此数组:

char buffer[0x1000];

但是你在几个地方把它当作一个空终止的C字符串,而不确定它实际上是空终止的。

例如,在Inet::GetResponse()

int result = recv((*sock), buffer, strlen(buffer), 0)

我认为strlen(buffer)不会返回任何有意义的内容。 你可能应该使用sizeof(buffer)

但即使您处理接收到的数据,也无法保证数据将被终止 - 即使协议确实终止了带有空值的记录。使用TCP,recv()只能返回已发送记录的一部分,因此即使在发送空值的情况下,也可能尚未收到。特别是,POP3和IMAP协议使用空八位字节终止响应。因此,除非您确保'\0'在那里,否则strlen()和朋友将无法使用。

您需要仔细重新检查您如何处理缓冲区大小以及该代码中收到的数据量。