指向std::string中c_str函数的指针的寿命。

问题描述 投票:0回答:1

首先是下面列出的代码。

#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指针的寿命被破坏。

c++ string pointers c-str
1个回答
3
投票

这段代码有 未定义行为.

在第二种情况下, printf()జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ cs 指针仍然指向已经释放的内存。你得到同样的输出只是意味着该内存的内容还没有被覆盖。但是访问释放的内存仍然是无效的。


2
投票

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


1
投票

只是猜测,但是。

© www.soinside.com 2019 - 2024. All rights reserved.