String类的c_str实现

时间:2016-01-15 22:36:39

标签: c++ string accelerated-c++

我正在阅读有关实施string课程的Accelerated C++一书中的第12章。

实现c_str()功能有一个章末问题。我正在寻找一些想法。

这是我到目前为止所做的:

我的第一次尝试是堆分配一个char *并返回它。但这会导致内存泄漏:

cost char * c_star() const {
   //cannot get reference to result later
   //causes memory leaks

   char* result = new char[data.size() + 1];
   std::copy(data.begin(), data.end(), result);
   result[data.size()] = '\0';
   return result;
}

这是另一次尝试:

const char* c_str() const {
    //obviously incorrect implementation as it is not NUL('\0') terminated.
    return &data[0];
}

我不能push_back '\0'数据,因为它不应该更改数据。

以下是spec

  

返回一个指向数组的指针,该数组包含一个以空字符结尾的字符序列(即C字符串),表示字符串对象的当前值。

这是书籍实施:(重命名为Str)。在内部,字符存储在向量实现(Vec)中。

class Str {
    public:
       .
       .
       .

    private:
        Vec<char> data;
};

1 个答案:

答案 0 :(得分:2)

根据注释,我实现了Str类,确保在每个字符串的末尾都有一个NUL('\ 0')。我将数据存储在字符数组中而不是矢量:

class Str {
    public:
        typedef char* iterator;
        typedef const char* const_iterator;
        .
        .
        .
        //c_str return a NUL terminated char array
        const char* c_str() const { return str_beg; };
        //c_str and data are same as implementation make sure there is NUL
        //at the end
        const char* data() const { return str_beg; };
        .
        .
        .

    private:
        iterator str_beg;
        .
        .
        .
};