2017-02-28 20 views
0

このコードブロックはメモリリークを引き起こす可能性がありますか?このコードブロックはメモリリークを引き起こしますか?

char * foo = new char [20]; 
read(STDIN_FILENO, foo, 20); 
string bar; 
bar.reserve(20); 
bar = foo; 
delete[] foo; 

我々はメモリのチャンクを解放するためにdelete[]を使用するように私は、それができないと思います。ただし、オブジェクトbarはここで違いを生むかもしれません。あなたのポイントを共有してください。

+5

C++については、stackoverflowに関する質問をしないでください。あなたを含め、誰もが悲惨になるだけです。代わりに[書籍](https://stackoverflow.com/questions/388242)をお読みください。 – nwp

+7

'string bar;'、 'bar = foo'、' bar.reserve(20) 'のいずれかがスローされると、あなたはmemleakを持っています。 – Jarod42

+2

宿題サービス警告... – Chiel

答えて

5

string bar;,bar.reserve(20)またはbar = fooのいずれかがスローされた場合、あなたはmemleakを持っています。

あなたはそれを避けるために、いくつかのスマートポインタを使用することがあります。

auto foo = std::make_unique<char[]>(20); 
0

ご予約は必要ありませんし、あなたが標準入力から読み込ん20バイトの1つが\ 0である場合にのみ、数バイトを記入します。

ここ

は正しいコードです:

char * foo = new char [20]; 
read(STDIN_FILENO, foo, 20); 
string bar; 
bar.assign(foo, 20); 
delete[] foo; 

...あなたはSTD上の例外に問題::文字列(コンストラクタまたはASSIGN)を持っているかもしれませんが、あなたは大きな割り当てる場合はメモリ例外私見にのみ処理する必要があります20バイトの割り当てが最も確実に失敗した場合、例外を適切に処理することができなくなるためです。 Jarod42 @

char foo[20]; 
int len = read(STDIN_FILENO, foo, sizeof(foo)); 
string bar; 
if (len > 0) 
    bar.assign(foo, len); 
0

が正しいこと:私はこのようにそれをやるの両方の速度と安全のために、あなたのコードを改善しなければならないとしたら

。スマートポインタを使うべきです。しかし、(理論を理解するために)スマートポインタせずにこの問題を解決するために、これを試してみてください。

char * foo = new char [20]; 

try{ 
    read(STDIN_FILENO, foo, 20); 
    string bar; 
    bar.reserve(20); 
    bar = foo; 
    deleted=true; 
    delete[] foo; 
    } 
catch (...){ 
    delete[] foo; 
    throw; 

} 

最初の行のいずれかで例外がある場合は、例外がキャッチされ、fooはまだでしょう削除される。しかし、魅力的な理由がない限り、使用する必要があります。unique_ptrまたはshared_ptr

+0

あなたは別の言語を話しています。 – rubenvb

+0

どういう意味ですか? –

+0

申し訳ありません。tryで構文エラーを逃しました。 –

0

コンパイル時にバッファサイズを知っている場合は、それを新しいものに割り当てるべきではありません。その代わりに、スタックに割り当てるか、サイズを変更した後に文字列のバッファに直接読み込む方がよいでしょう。そのようにすれば、コードを賢明に、あるいはそれ以外の方法で最大の効率を確保できます。

関連する問題