【问题标题】:Valgrind is not showing invalid memory access with incorrectly used c_str()Valgrind 未显示错误使用 c_str() 的无效内存访问
【发布时间】:2017-01-08 12:49:13
【问题描述】:

想象一下这样的代码:

string f()
{
  string r = "ab";
  return r;
}

int main() {
    const char *c = f().c_str();
    printf("%s.\n", c);
    return 0;
}

这段代码可能会崩溃,对吧?因为c 指向的那个字符串被破坏了。但是通过 Valgrind 运行它不会显示任何无效的内存访问。为什么?我知道 Valgrind 无法检查堆栈,但“ab”实际上位于堆上,对吧?

【问题讨论】:

  • 小字符串优化。试试"aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccc"
  • “现在我的实际问题如下”是什么意思?请提出一个新问题

标签: c++ string std valgrind


【解决方案1】:

这段代码可能会崩溃,对吧?因为c指向的那个字符串被销毁了。

没错。它具有未定义的行为,这意味着允许任何行为。崩溃是可能发生的事情之一。就像在你的实现中发生的那样,好像一切都没有错一样继续下去是另一个问题。

我知道 Valgrind 无法检查堆栈,但“ab”实际上位于堆上,对吧?

不一定。有一种短字符串优化,直接适合std::string对象本身的字符串存储在那里,以避免不必要的分配开销。

如果您说 Valgrind 无法检查堆栈访问,并且您返回的 std::string 存储在堆栈中,那就可以解释为什么 Valgrind 没有发现任何问题。

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 2022-08-18
    • 2012-05-21
    • 1970-01-01
    • 2021-08-24
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多