c – Valgrind未显示使用错误的c_str()的无效内存访问

前端之家收集整理的这篇文章主要介绍了c – Valgrind未显示使用错误的c_str()的无效内存访问前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
想象一下这样的代码
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”实际上位于堆上,对吧?

解决方法

This code may crash,right? Because that string that c points to is destroyed.

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

I know Valgrind cannot check the stack,but “ab” actually is located on the heap,right?

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

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

猜你在找的C&C++相关文章