古いC++のソースコードでは、配列や構造体の格納領域全てを0で埋めることで、初期化処理としていることがあります。memset関数やZeroMemoryマクロを使います。test1);}メモリリークチェック_CrtDumpMemoryLeaks()というデバッグ実行中に未開放のメモリ領域があるかどうかを調べる関数が存在します。以下の処理ではリークが起こらないので、特に何も出力されません。_CrtDumpMemoryLeaks();}文字列要素の持ち方を変えるここで、文字列をchar配列で持つのは今後のメンテナンスにも不便なので、std::stringというコンテナクラスに置き換えます。_CrtDumpMemoryLeaks();}これを実行すると、今度は以下のようにメモリリークしているという情報が出力されます。complete.ゼロクリアする前に書き込んだ、"cccccccccccccccc..."というデータがスコープを抜けても解放することができなかったということがわかります。std::stringコンテナクラスには、キャパシティーや実際の文字列が存在する領域のアドレスなどが入っています。それをゼロクリアするということは、数値要素は単純に0になるだけですが、アドレスが急に0になると、その先で確保していた領域がどこか忘れてしまうということです。そのため、その次に"dddddddddddddd..."という文字列の代入をした時点で本来なら解放されるはずの"cccccccccccccccc..."が解放できなくなっているということです。いうわけで、ちょっとでもクラスを扱う可能性のあるプログラムでは、基本的にゼロクリアは使用しないようにしましょう。編集トップへ戻る閉じる。