std::string.c_str()或std::string.data()返回的指针是否必须被释放?

问题描述 投票:0回答:5

据我所知,当您调用

std::string
/
c_str()
方法时,
data()
会创建其内容的相同数组副本(有/没有终止 NUL-char,这里并不重要)。不管怎样,该对象是否也负责释放这个数组,或者我必须这样做吗?

简而言之:

std::string hello("content");

const char* Ptr = hello.c_str();

// Use it....

delete[] Ptr;   //// Really ???

我只是想在内存分配方面保持安全。

c++ string memory-management
5个回答
8
投票

不,您不需要释放

ptr
指针。

ptr
指向位于内部位置某处的不可修改字符串(实际上这是编译器的实现细节)。


参考:

C++ 文档

const char* c_str ( ) const;

获取等效的 C 字符串

生成与字符串对象内容相同的以 null 结尾的字符序列(c 字符串),并将其作为指向字符数组的指针返回。

自动附加终止空字符。

返回的数组指向一个内部位置,该位置具有该字符序列及其终止空字符所需的存储空间,但该数组中的值不应在程序中修改,并且只能保证在下一个字符之前保持不变调用字符串对象的非常量成员函数。


3
投票

std::string 处理该指针,因此不要释放它。而且,使用这个指针有两个限制:
1. 不要修改该指针所指向的字符串,它是只读的。
2. 调用其他std::string方法后,该指针可能会失效。


2
投票

没有任何必要。字符串类的析构函数将处理字符串的销毁,因此当“hello”超出范围时,它会被释放。


0
投票

您不仅不需要释放指针,而且实际上您不应该。否则

std::string
的析构函数将尝试再次释放它,这可能会导致各种错误,具体取决于平台。


0
投票

std::string
类负责在该类的对象被破坏时释放分配用于包含字符串字符的内存。所以如果你这样做

delete[] Ptr;

hello
对象被破坏之前或之后(保留创建它的 C++
{}
作用域),您的程序将遇到尝试释放已释放内存块的问题。

© www.soinside.com 2019 - 2024. All rights reserved.