Microsoft C++ 异常:内存位置的 std::out_of_range
Posted
技术标签:
【中文标题】Microsoft C++ 异常:内存位置的 std::out_of_range【英文标题】:Microsoft C++ exception: std::out_of_range at memory location 【发布时间】:2018-07-18 18:23:06 【问题描述】:我试图使用 find() 和 substr() 输出文件中的特定行,只是为了看看它是否有效。如您所见,我是个初学者,因此我将不胜感激任何有关我的代码的 cmets 或提示。
inFile.open("config.txt");
string content;
while (getline(inFile, content))
if (content[0] && content[1] == '/') continue;
size_t found = content.find("citylocation.txt");
string city = content.substr(found);
cout << city << '\n';
【问题讨论】:
find
每次都会失败,除了匹配的一行。使用前需要检查found
。
content[0] && content[1] == '/'
这不会检查行是否以//
开头。它检查(content[0]) && (content[1] == '/')
。
content[0]
也不检查该行是否为空。未定义的行为,有崩溃的可能性。
此外,我非常有信心,即使该行至少有两个字符,content[0] && content[1] == '/'
也不会像您认为的那样做。我重复一遍,它不不检查该行中的前两个字符是否为斜杠,正如您可能的意图那样。 C++ 不能以这种方式工作。
天哪,三个 cmets 说 content[0] && content[1] == '/'
没有做你想做的事,但是三个都没有说如何编写那个测试。欢迎来到 StackExchange!如果您知道content
中至少有两个字符,那么您应该检查content[0] == '/' && content[1] == '/'
。
【参考方案1】:
关于以下摘录的几点说明:
content[0] && content[1] == '/'
当您编写content[0]
和content[1]
时,您假设位置0 和1 的字符存在,但不一定如此。您应该将此代码包装在if (content.size() >= 2) ...
之类的条件中,以防止您访问不存在的字符串内容。
其次,正如目前所写的那样,这段代码会将content[0]
转换为bool
,因为逻辑与运算符&&
的工作原理。如果你想检查第一个和第二个字符是否都是'/'
,你应该写content[0] == '/' && content[1] == '/'
另外,在下面的sn-p中:
size_t found = content.find("citylocation.txt");
string city = content.substr(found);
如果在字符串中找不到"citylocation.txt"
,会发生什么? std::string::find
通过返回特殊值 std::string::npos
来处理这个问题。您应该对此进行测试以检查是否可以找到子字符串,以防止自己读取无效的内存位置:
size_t found = content.find("citylocation.txt");
if (found != std::string::npos)
std::string city = content.substr(found);
// do work with 'city' ...
【讨论】:
以上是关于Microsoft C++ 异常:内存位置的 std::out_of_range的主要内容,如果未能解决你的问题,请参考以下文章
0x75BA812F 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常:
API Microsoft Translator 异常:“根级别的数据无效。第 1 行,位置 1。”
0x00007FFD15EA9E08 处(位于 test1.exe 中)有未经处理的异常: Microsoft C++ 异常
Microsoft.Azure.Cosmos.Table LocationMode.SecondaryOnly RA-GRS 异常 此操作只能针对主存储位置执行
c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?