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

时间:2011-09-18 09:59:03

标签: c++ string memory-management

据我所知,当您调用std::string / c_str()方法时,data()会创建其内容的ident数组副本(使用/ out终止NUL-char,不会这里的问题)。无论如何,该对象是否也负责释放这个数组或者我必须这样做?

简而言之:

std::string hello("content");

const char* Ptr = hello.c_str();

// use it....

delete[] Ptr;   //// really ???

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

5 个答案:

答案 0 :(得分:7)

不,您不需要释放ptr指针。

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


参考:

C++ documentation

const char* c_str ( ) const;

获取等效的C字符串

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

自动附加终止空字符。

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

答案 1 :(得分:2)

不需要,字符串类的dtor将处理字符串的破坏,因此当'hello'超出范围时,它将被释放。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您不仅不需要释放指针,而且实际上不应该。否则std::string的析构函数将尝试再次释放它,这可能会导致各种错误,具体取决于平台。

答案 4 :(得分:0)

std::string类负责释放分配的内存,以便在类的对象被销毁时包含字符串的字符。所以,如果你这样做

delete[] Ptr;

hello对象被破坏之前或之后(离开创建它的C ++ {}范围),程序将遇到尝试释放已释放的内存块的问题。 / p>