将char缓冲区转换为字符串时需要strdup

时间:2017-05-02 04:31:52

标签: c++ string

我有一个c ++ char缓冲区,我在其中重复读取文件中的字符。读完每一行后,我将缓冲区转换为字符串,以便进行其他处理和存储。

int main() {
    char buf[1024];
    FILE *f;
    while(1) {
        fgets(buf, MAXBUF, f); //read a line from a file
        string s1(buf);
        string *s2 = new string(buf);
    }
}

将缓冲区转换为字符串时,是自动复制还是必须明确复制?即,我应该将上述代码重写为:

        string s1(strdup(buf));
        string *s2 = new string(strdup(buf));

2 个答案:

答案 0 :(得分:1)

不,在分配到std :: string时,您不需要stroup char *。该字符串将自动创建自己的副本,并处理所述副本的所有内存管理。

答案 1 :(得分:1)

  

将缓冲区转换为字符串时,是自动复制,还是必须明确复制?

您不仅不需要调用strdup来创建s1,还会导致内存泄漏。

strdup为输入字符串的副本分配内存并将该内存返回给您。

string的构造函数生成输入字符串的副本。

因此,strdup分配的内存在您的程序中丢失。

不要使用它。只需使用:

string s1(buf);