首先是下面列出的代码。
#include<string>
#include<stdio.h>
int main(){
const char *cs;
{
std::string s("123456");
cs = s.c_str();
printf("cs = %s\n",cs);
}
printf("cs = %s\n",cs);
return 0;
}
运行它,结果如下。 (Linux gcc)
cs = 123456 cs = 123456
所以,我不知道为什么 cs 指针在 s 换句话说,指向std::string函数的c_str指针的寿命被破坏。
这段代码有 未定义行为.
在第二种情况下, printf()
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ cs
指针仍然指向已经释放的内存。你得到同样的输出只是意味着该内存的内容还没有被覆盖。但是访问释放的内存仍然是无效的。
这是一个典型的use-after-free问题,cs指向的那块内存被释放了,但是幸运的是,它还没有被返回到内核或者被你的程序重新使用。use-after-free的行为是没有定义的,你不应该这样做。这是最难处理的问题之一。Google开源了一个工具来帮助你检测代码中的use-after-free。https:/github.comgooglesanitizerswikiAddressSanitizer。
只是猜测,但是。