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

har*_*ula 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bat*_*eba 5

c_str()给你一个指向数据缓冲区的指针std::string(有一个NUL终结符保证在字符串的末尾添加),就是这样.请注意,如果超出范围,销毁或更改指针,则指针无效std::string.

在你的情况下的行为cout << ptr << endl; 是不确定的.这是因为ptr被设置为返回值c_str()对已不存在的字符串,而cout对于const char*有试图读取从指针字符缓冲区最多遇到的第一个NULL字符一个特殊的过载.您观察到的结果是未定义行为的表现.

请注意,cout << (void*)ptr << endl;也是未定义的,因为一旦您不再拥有地址的内存,指针基本上处于未初始化状态.

  • 使用`ptr`本身的值真的好吗?由于拥有的`std :: string`被破坏而被释放后指针是否无效? (2认同)

归档时间:

查看次数:

180 次

最近记录:

6 年,9 月 前