std :: string :: c_str()如何返回一个不会导致内存泄漏或未定义的c-string内容的c-string?

时间:2012-07-04 23:30:35

标签: c++ string memory cstring

我正在编写一个类似于std :: string的字符串类作为家庭作业,但我无法弄清楚如何返回一个不会导致内存泄漏的c字符串,并保证保持不变直到它已不再使用。我目前有:

const char* string::c_str()
{
    char c[_size+1];
    strncpy(c,_data,_size);
    c[_size]='\0';
    return c;
}

但是在调用后不久就会覆盖内容。如果我进行动态分配,我会有内存泄漏,或者任何时候只能从给定的字符串中存在一个c字符串。我怎么能避免这个?

3 个答案:

答案 0 :(得分:7)

但是c_str指向的字符串只有在std::string下次修改(或销毁)之后才能很好地定义。

实现此目的的一种方法可能是简单地返回指向内部缓冲区的指针(假设它以空值终止)。请记住,符合标准的c_str必须在O(1)时间内运行;所以不允许复制。

答案 1 :(得分:4)

来自http://www.cplusplus.com/reference/string/string/c_str/

  

返回的数组指向具有必需的内部位置   此字符序列的存储空间加上其终止   null-character,但不应修改此数组中的值   该计划只保证在下一次之前保持不变   调用字符串对象的非常量成员函数。

答案 2 :(得分:0)

c_str()返回的缓冲区不保证在不再使用之前保持不变甚至有效。

只有在以任何方式更改std :: string之前,它才能保证有效。

实现很简单:只需保持字符串的内部表示始终以null结尾,并从c_str()返回指向内部表示的指针。