据我所知,当您调用std::string
/ c_str()
方法时,data()
会创建其内容的ident数组副本(使用/ out终止NUL-char,不会这里的问题)。无论如何,该对象是否也负责释放这个数组或者我必须这样做?
简而言之:
std::string hello("content");
const char* Ptr = hello.c_str();
// use it....
delete[] Ptr; //// really ???
我只想在内存分配方面保持安全。
答案 0 :(得分:7)
不,您不需要释放ptr
指针。
ptr
指向位于内部位置某处的不可修改字符串(实际上这是编译器的实现细节)。
参考:
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>