c_str()是在堆中分配内存吗?

时间:2018-10-03 13:36:52

标签: c++

最近我遇到了c_str()的问题。下面是示例代码段

#include<bits/stdc++.h>
#include<unistd.h>
using namespace std;
class har{

    public:
    string h;
    har(string str){
        h=str;
    }
};

int main(){


har *hg=new har("harish");
const char *ptr=hg->h.c_str();
delete hg;
cout<<ptr<<endl;
return 0;
}

我得到的输出是“ harish”。...我已经销毁了对象,但仍然得到了输出。.是c_str()再次在堆中分配内存。

1 个答案:

答案 0 :(得分:5)

c_str()为您提供指向std::string中数据缓冲区的指针(保证在字符串的末尾添加NUL终止符),仅此而已。请注意,如果std::string超出范围,被破坏或被更改,则指针是无效的

在您的情况下,cout << ptr << endl的行为;是 undefined 。这是因为在不再存在的字符串上将ptr设置为c_str()的返回值,并且cout的{​​{1}}有一个特殊的重载,试图读取该字符从该指针到遇到的第一个NUL字符的缓冲区。您观察到的结果表明了这种不确定的行为。

请注意,const char*也是未定义的,因为一旦您不再拥有某个地址的内存,指针就实质上处于未初始化状态。