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调试工具一起使用。
答案 0 :(得分:2)
input.append((char*)ch);
你为什么要投掷指针?这是非常错误的。由于函数重载分辨率,std::string
将尝试从与该字符的转换ASCII值对应的内存地址开始读取C字符串...这不是您要使用的内存。因此,访问违规......充其量。
您想要的是在相应的内存地址附加ASCII char
,而不是char*
。
当你在它的时候,使用正确的C ++强制转换,它会在这个上犯错误,永远不会让你编译它。再说一次,如果你有任何警告,即使是老C演员应该至少警告过这个。
input.append( static_cast<char>(ch) );
(注意:我认为getch()
不会返回任何无法安全地投放到int
的{{1}}。我没有查看其文档,因为它似乎如果该值可能超出范围,则您有责任检查这一点,因为在导致溢出时进行强制转换会最多调用未定义的 unreliable/non-portable行为。)