最近我有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;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出"harish"....我已经销毁了对象,但我仍然得到输出..是c_str()再次在堆中分配内存.
c_str()给你一个指向数据缓冲区的指针std::string(有一个NUL终结符保证在字符串的末尾添加),就是这样.请注意,如果超出范围,销毁或更改指针,则指针无效std::string.
在你的情况下的行为cout << ptr << endl; 是不确定的.这是因为ptr被设置为返回值c_str()对已不存在的字符串,而cout对于const char*有试图读取从指针字符缓冲区最多遇到的第一个NULL字符一个特殊的过载.您观察到的结果是未定义行为的表现.
请注意,cout << (void*)ptr << endl;也是未定义的,因为一旦您不再拥有地址的内存,指针基本上处于未初始化状态.
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |