[解決済み】C++のコード/プロジェクトでメモリリークを見つけるには?
質問
私はWindowsプラットフォームでC++プログラマをしています。Visual Studio 2008を使用しています。
私は通常、メモリリークのあるコードに行き着きます。
通常はコードを検査することでメモリリークを見つけるのですが、面倒なので必ずしも良い方法とは言えません。
有料のメモリリーク検出ツールは買えないので、メモリリークを回避するための最善の方法を皆さんに提案してもらいたかったのです。
- プログラマーがどのようにメモリリークを発見できるのか知りたい。
- プログラム中にメモリリークがないことを確認するための基準や手順がありますか?
どのように解決するのですか?
操作説明
必要なもの
- C++の熟練度
- C++コンパイラ
- デバッガなどの調査用ソフトウェアツール
1
演算子の基本を理解する。C++の演算子
new
はヒープメモリを確保します。その
delete
演算子はヒープメモリを解放します。すべての
new
を使用する必要があります。
delete
で、割り当てたメモリと同じものを解放します。
char* str = new char [30]; // Allocate 30 bytes to house a string.
delete [] str; // Clear those 30 bytes and make str point nowhere.
2
削除した場合のみ、メモリを再割り当てする。以下のコードでは
str
は、2回目のアロケーションで新しいアドレスを取得します。最初のアドレスは回復不能なほど失われ、それが指していた30バイトも失われます。このため、メモリリークが発生してしまいます。
char* str = new char [30]; // Give str a memory address.
// delete [] str; // Remove the first comment marking in this line to correct.
str = new char [60]; /* Give str another memory address with
the first one gone forever.*/
delete [] str; // This deletes the 60 bytes, not just the first 30.
3
ポインタの割り当てに注意してください。すべての動的変数(ヒープ上に割り当てられたメモリ)は、ポインタと関連付ける必要があります。動的変数がそのポインタから切り離されると、その変数を消去することは不可能になります。この場合も、メモリリークになります。
char* str1 = new char [30];
char* str2 = new char [40];
strcpy(str1, "Memory leak");
str2 = str1; // Bad! Now the 40 bytes are impossible to free.
delete [] str2; // This deletes the 30 bytes.
delete [] str1; // Possible access violation. What a disaster!
4
ローカルポインタの扱いに注意してください。関数内で宣言したポインタはスタック上に確保されますが、それが指し示す動的変数はヒープ上に確保されます。これを削除しないと、プログラムがその関数を終了した後でも、そのポインタは持続します。
void Leak(int x){
char* p = new char [x];
// delete [] p; // Remove the first comment marking to correct.
}
5
delete.quot;の後にある角括弧に注目します。
delete
を単体で使用すると、1つのオブジェクトを解放することができます。使用方法
delete []
を角括弧で囲むとヒープ配列が解放されます。このようなことはしないでください。
char* one = new char;
delete [] one; // Wrong
char* many = new char [30];
delete many; // Wrong!
6
まだ漏れが許されるのであれば - 私は通常deleakerでそれを求めています(ここで確認してください。 http://deleaker.com ).
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】標準コンテナでstd::auto_ptr<>を使うのはなぜいけないのでしょうか?