使用错误的c_str()时,Valgrind没有显示无效的内存访问

时间:2017-01-08 12:49:13

标签: c++ string std valgrind

想象一下这样的代码:

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"实际上位于堆上,对吧?

1 个答案:

答案 0 :(得分:10)

  

此代码可能会崩溃,对吧?因为c指向的字符串被破坏了。

右。它具有未定义的行为,这意味着允许任何行为。崩溃是可能发生的事情之一。继续好像没有任何错误,就像你的实现一样,是另一个。

  

我知道Valgrind无法检查筹码,但是" ab"实际上位于堆上,对吧?

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

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