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] &amp;&amp; content[1] == '/' 这不会检查行是否以// 开头。它检查(content[0]) &amp;&amp; (content[1] == '/') content[0] 也不检查该行是否为空。未定义的行为,有崩溃的可能性。 此外,我非常有信心,即使该行至少有两个字符,content[0] &amp;&amp; content[1] == '/' 也不会像您认为的那样做。我重复一遍,它不检查该行中的前两个字符是否为斜杠,正如您可能的意图那样。 C++ 不能以这种方式工作。 天哪,三个 cmets 说 content[0] &amp;&amp; content[1] == '/' 没有做你想做的事,但是三个都没有说如何编写那个测试。欢迎来到 StackExchange!如果您知道content 中至少有两个字符,那么您应该检查content[0] == '/' &amp;&amp; content[1] == '/' 【参考方案1】:

关于以下摘录的几点说明:

content[0] && content[1] == '/'

当您编写content[0]content[1] 时,您假设位置0 和1 的字符存在,但不一定如此。您应该将此代码包装在if (content.size() &gt;= 2) ... 之类的条件中,以防止您访问不存在的字符串内容。

其次,正如目前所写的那样,这段代码会将content[0] 转换为bool,因为逻辑与运算符&amp;&amp; 的工作原理。如果你想检查第一个和第二个字符是否都是'/',你应该写content[0] == '/' &amp;&amp; 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...时发生访问冲突?

win进程崩溃弹出Microsoft Visual C++ Runtime Library的解决办法