想象一下这样的代码:

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

最佳答案



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



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

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

关于c++ - Valgrind没有显示使用不正确的c_str()进行的无效内存访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41532864/

10-11 19:58
查看更多