ChatClient.exe中的0x0F4CD6F0(ucrtbased.dll)引发异常:0xC0000005:访问冲突读取位置0x00000068。


几天来,我一直在努力寻找该错误的根源,最后我最终摘录了一个片段来说明我遇到的问题。在switch语句之后立即引发异常。我不知道是什么原因导致了这段相对普通的代码中的“访问冲突”:

#include <iostream>
#include <string>
#include <conio.h>

int main(){
    bool room = true, type = true;
    string input;
    unsigned int scroll = 0;
    while (room) {
        cout << input;
        /* Input */
        int ch = _getch();
        switch (ch) {
        case 72: /* scroll up */
            if (!type && scroll != sizeof(unsigned int))
                scroll++;
            break;
        case 80: /* scroll down */
            if (!type && scroll != 0)
                scroll--;
            break;
        case 13: /* Send message */
            input.clear();
            scroll = 0;
            break;
        case 27: // Quit loop
            room = false;
            break;
        case 9: // Switch between scrolling and typing modes
            if (type)
                type = false;
            else
                type = true;
            break;
        default:
            if (type && ch != -32) {
                input.append((char*)ch);
            }
            break;
        }
    } <- Exception thrown, probably when the while loop condition is re-evaluated?
    return 0;
}


将Visual Studio 2017与默认的IDE调试工具一起使用。

最佳答案

input.append((char*)ch);


为什么要投射到指针?那是非常错误的。由于函数过载解析,std::string将尝试从与该字符的强制转换ASCII值相对应的内存地址开始读取C字符串...这不是您要使用的内存。因此,访问冲突……充其量。

您想要的是在相应的内存地址后面添加ASCII char,而不是char*

在使用它时,请使用适当的C ++强制转换,它可能会对此错误,并且永远不会让您对其进行编译。再说一次,如果您有任何警告,即使是旧的C语言强制转换也至少应该对此有所警告。

input.append( static_cast<char>(ch) );


(注意:在您的情况下,我认为getch()不会返回任何无法安全转换为intchar。我没有研究其文档,因为它似乎有些旧的conio很愚蠢。如果该值可能超出范围,您有责任进行检查,因为在导致溢出时进行强制转换最多会调用未定义的unreliable/non-portable行为。)

关于c++ - 访问冲突错误-ucrtbased.dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49882851/

10-11 18:44