最近我遇到了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()再次在堆中分配内存。
答案 0 :(得分:5)
c_str()
为您提供指向std::string
中数据缓冲区的指针(保证在字符串的末尾添加NUL
终止符),仅此而已。请注意,如果std::string
超出范围,被破坏或被更改,则指针是无效的。
在您的情况下,cout << ptr << endl
的行为;是 undefined 。这是因为在不再存在的字符串上将ptr
设置为c_str()
的返回值,并且cout
的{{1}}有一个特殊的重载,试图读取该字符从该指针到遇到的第一个NUL字符的缓冲区。您观察到的结果表明了这种不确定的行为。
请注意,const char*
也是未定义的,因为一旦您不再拥有某个地址的内存,指针就实质上处于未初始化状态。