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

标签 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() 再次在堆中分配内存。

最佳答案

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

在您的案例中,cout << ptr << endl 的行为; 未定义。这是因为 ptr被设置为 c_str() 的返回值在不再存在的字符串上,以及 cout对于 const char*有一个特殊的重载,它尝试从该指针读取字符缓冲区,直到遇到第一个 NUL 字符。您观察到的结果是这种未定义行为的表现。

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

关于c++ - c_str() 是在堆中分配内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628303/

相关文章:

c++ - 我可以得到单独的 DLL 来分别解析它们导入的 DLL 吗?

c++ - 如何在模板化转换运算符中消除这种构造的歧义?

c++ - 如果输入数量未知,则接受输入

c++ - 如何使用 CMake 在 ubuntu 上找到已安装的 Boost 库?

c++ - 我可以在 Qt 中的继承类的初始化中放置什么

c++ - 定位运行在集群上的多线程程序的段错误

c++ - 使用 CMake 创建和使用库

函数中的 C++ 指针

java - OOP 和堆/栈

c++ - 在递归函数 C++ 中保持计数