6

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

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

但内容在调用后不久就会被覆盖。如果我进行动态分配,我会出现内存泄漏,或者在任何时候给定字符串中只能存在一个 c 字符串。我怎样才能避免这种情况?

4

3 回答 3

7

但是 指向的字符串只有在下一次修改(或销毁)c_str之前是明确定义的。std::string

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

于 2012-07-04T23:33:03.830 回答
4

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

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

于 2012-07-04T23:33:43.950 回答
0

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

仅保证在 std::string 以任何方式更改之前保持有效。

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

于 2012-07-04T23:37:10.063 回答