【问题标题】:coredump in string assignment字符串赋值中的coredump
【发布时间】:2011-08-19 03:08:02
【问题描述】:

我想知道当我们尝试使用 getline() 函数从文件中读取一行时可能出现分段错误的场景

例如:

ifstream h("one.txt");
string s;
getline(h,s); //what assignment to 'h' can lead to segmentaion fault here (or) 
              //is it possible to get the segmentation fault based on the content of the file?

我需要这个答案

【问题讨论】:

  • 在此之前运行的代码。并破坏了堆。
  • 正如 Hans 所说,几乎可以肯定是堆损坏。 getline 为 ifstream 读取缓冲区分配内存并为字符串分配内存,因此如果堆损坏,它将出现段错误。
  • “会出现段错误”。不会。它会出现段错误如果你很幸运。正确的短语是“如果堆损坏了,你有 UB 并且任何事情都可能发生”。
  • 您是否看到此代码产生了段错误,或者您是否在询问可能发生这种情况的假设情况?

标签: c++ coredump


【解决方案1】:

我想如果“one.txt”包含的行长于内存容量,您可能会遇到未定义的行为(可能 表现为段错误)。 getline() 读取的字符数受string 对象的max_size() 限制,但这可能非常大。

【讨论】:

    【解决方案2】:

    是否有可能根据内容得到分段错误 文件?

    这几乎是不可能的,假设您的代码没有 未定义的行为 - 否则一切皆有可能,包括分段错误。许多人使用标准 C++ 库。它经过了很好的测试,并对输入值进行错误检查。

    【讨论】:

    • -1:绝对有可能。标准库函数不会包含导致 UB 的 bug,但是您自己的导致 UB 的 bug 肯定会影响标准库函数。
    • 我假设我的代码没有 UB。在这种情况下,这段代码几乎不会因为文件的某些特殊内容而崩溃。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多