2017-05-02 1 views
-1

ファイルから文字を繰り返し読み込むC++のcharバッファがあります。各行を読み終えたら、バッファを文字列に変換して、他の処理と保存を行います。charバッファをstringに変換するのにstrdupが必要です

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); 
    } 
} 

バッファを文字列に変換するときに、自動的にコピーが作成されるか、明示的にコピーを作成する必要がありますか? std ::文字列に割り当てるときに

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

コピーは自動的に行われますが、 'std :: getline'を使って文字列を直接読み込むだけです。そして 'new'を使わないでください。 'FILE * 'は使わないでください。 – Ryan

+0

テストコードにもメモリが漏れていることをご存じでしょうか。 –

+0

サンプルコードに無限ループがあります。 – thebat

答えて

1

バッファを文字列に変換するときに、自動的にコピーが作成されるか、明示的にコピーを作成する必要がありますか?

だけでなく、あなたがs1を作成するためにstrdupを呼び出す必要はありません、それはメモリリークが発生します。

strdupは、入力文字列のコピーにメモリを割り当て、そのメモリをユーザに返します。

コンストラクタstringは、入力文字列のコピーを作成します。

Ergo、strdupによって割り当てられたメモリは、プログラムで失われます。

使用しないでください。

string s1(buf); 
0

いいえ、あなたは、char *をSTRDUPする必要はありません:としてつまり、私は上記のコードを書き直す必要があります。文字列は自動的にそれ自身のコピーを作成し、前記コピーのすべてのメモリ管理を処理します。

関連する問題