想象一下这样的代码:
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”实际上位于堆上,对吧?
解决方法
@H_502_10@
This code may crash,right? Because that string that c
points to is destroyed.
对.它具有未定义的行为,这意味着允许任何行为.崩溃是可能发生的事情之一.继续好像没有任何错误,就像你的实现一样,是另一个.
@H_502_10@I know Valgrind cannot check the stack,but “ab” actually is located on the heap,right?
不必要.存在短字符串优化这样的事情,其中直接适合std :: string对象本身的字符串存储在那里,以避免不必要的分配开销.
如果你说Valgrind无法检查堆栈访问,并且你返回的std :: string存储在堆栈中,那就可以解释为什么Valgrind没有看到任何问题.