0

首先列出的代码如下。

#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

所以,我不知道为什么在s 被销毁后cs指针是有效的。换句话说,指向 std::string 中 c_str 函数的指针的生命周期。

4

3 回答 3

3

代码具有未定义的行为

在第二个printf()中,cs指针仍然指向已释放的内存。您获得相同输出的事实仅意味着该内存的内容尚未被覆盖。但是访问释放的内存仍然无效。

于 2020-05-04T07:05:31.180 回答
2

这是一个典型的 use-after-free 问题,cs 指向的那块内存被释放了,但幸运的是,它还没有被返回给内核,也没有被你的程序重用。use-after-free 的行为是未定义的,你不应该这样做。这是最难处理的问题之一。Google 开源了一个工具来帮助您检测代码中的 use-after-free: https ://github.com/google/sanitizers/wiki/AddressSanitizer

于 2020-05-04T07:51:29.260 回答
1

只是猜测,但是:

于 2020-05-04T06:59:44.993 回答