2016-11-13 6 views
0

C++の新機能はこちら。次の場合にメモリリークが発生する可能性がありますか?逆参照された文字列に割り当てる - これはメモリリークを引き起こす可能性がありますか?

// debug is optional, for debugging purposes. 
// Say my_string is an internal string class my company uses. 

int DoSomething(my_string *debug) { 
    const my_string& s = GetString(); 
    if (debug != nullptr) *debug = s; // Could this cause a memory leak? 
    return DoSomethingElse(s); 
} 

私はここに私の理解をチェックしたい:私は、メモリの領域がdebugで指さコメント行で考える著作がある場合を除き、単に、sの内容(のコピー)で上書きされますmy_stringのために実装されたコンストラクタです。この場合、他にもいくつかの処理が行われる可能性があります。

my_stringの特別なコピーコンストラクタが存在しない場合、my_stringが内部表現で任意の動的に割り当てられたメモリを指している場合(これはおそらく任意の長さの文字列を保持できるため)、上記のコードはメモリリーク。

また、C++の「エチケット」に関するもう1つの質問は、誰かがmy_stringを書いた人が、このような場合にメモリリークを避けるためにコピーコンストラクタを書いたと仮定することができますか?つまり、私自身のコードにはnewがありません。このコードがメモリリークを引き起こすのであれば、それは私の「誤り」ではないと言うのは妥当でしょうか?

EDIT:コピーコンストラクタではなく、上記のコピー代入演算子を意味すると思います。

+2

'my_string'は、' std :: string'よりもむしろそれを使うために、*リークしないことを確認する単体テストのセットを持っている方が良いでしょう。もちろん、これは 'my_string'のリークを引き起こす可能性があります。そして、もしあなたが**知っていれば**それはとにかくそれを吸って、それを使用すると、間違いなくあなたはそれがあなたのせいだと断言できます。 – WhozCraig

+2

多分はい、多分いいえ。ここに示されていないコードに依存します。 – juanchopanza

+0

@WhozCraig @juanchopanza 'my_string'の実装にのみ依存するのですか、' GetString'と 'DoSomethingElse'にも依存していますか? – John

答えて

-2

はい、あなたの欠陥は、あなたが悪いと知っていることを知っていることは常にあなたのせいです。それを修正するか、コメントをたくさん書いて回避するが、他人の問題をふりまとうことはない。

コードはリークしませんが、クラッシュする可能性があります。

何が起こるかは、文字列へのポインタを返すことですが、関数を終了すると、元の文字列のメモリが削除されます。現在では通常、メモリは短時間で元のままですが、遅かれ早かれ(通常は早く)、文字列が占有していたメモリを使い、最悪の場合はクラッシュします。

GetStringから返されたmy_stringは、この一時的なオブジェクトを指すように一時的なコピー(コードは表示されていません)を作成することに注意してください。 GetStringが元の文字列へのポインタを返す場合は、より安全な場所にいますが、GetStringが返す元の文字列を所有しているものは何でもありません。

コピーされた文字列オブジェクトを返します(コンパイラーはこれを最適化して最小限のメモリコピーを取得します)。または、shared_ptrを返して所有権を改善できます。

1

これは理論上メモリリークの可能性があります。しかし、内部的にあらゆる種類のリソースを管理するクラスを書くときは、常にThe Rule of FiveRAIIを尊重してください。私が意味することは、my_stringクラスを書く人がうまくいけば、明示的にコピー演算子を定義してリークが起こらないということです。

また、コピーコンストラクタとコピー演算子の違いを十分に理解していない場合は、this questionが役に立ちます。

0

答えは全くmy_string operator=(const my_string& s)の内容によって異なります。あなたが作成したローカルの一時的な文字列が所有するメモリを参照する場合、それはその誤りです。あなたがそれについて知っていればあなたもあなたのものです。その場合、クラッシュする可能性があります。

もしあなたがoperator=に渡された文字列の深いコピーを作成したら、すべてがうまくいきます。そして、あなたのローカル文字列が有効範囲外になったらうまくいきます。

メモリリークが心配すべきではなく、文字列debugにダングリングが発生する可能性があります。

関連する問題