メモリ リーク
動的に割り当てられたメモリが解放されない
説明
この欠陥は、malloc、calloc、realloc、または new を介して割り当てられたメモリのブロックが解放されなかった場合に発生します。メモリが関数内で割り当てられる場合、以下の条件を満たせば欠陥は生じません。
関数内で、
freeまたはdeleteを使用してメモリが解放される。関数が
malloc、calloc、reallocまたはnewによって割り当てられたポインターを返す。関数がグローバル変数またはパラメーターにポインターを格納する。
リスク
malloc などの動的メモリ割り当て関数はヒープ上のメモリを割り当てます。使用後にメモリを解放しないと、別の割り当てに使用できるメモリの量が減少します。メモリに制限がある組み込みシステムでは、プログラムの実行中でも、使用可能なヒープ メモリを使い果たす可能性があります。
修正方法
動的に割り当てられたメモリへのアクセスがあるスコープを確認します。このスコープの最後でメモリ ブロックを解放します。
メモリのブロックを解放するには、メモリの割り当て時に使用したポインターに対して関数 free を使用します。次に例を示します。
ptr = (int*)malloc(sizeof(int)); ... free(ptr);
同じモジュール内のメモリは同じ抽象化レベルで割り当てと解放を行うことをお勧めします。次の例の場合、func はメモリの割り当てと解放を同じレベルで行っていますが、func2 はそうではありません。
void func() {
ptr = (int*)malloc(sizeof(int));
{
...
}
free(ptr);
}
void func2() {
{
ptr = (int*)malloc(sizeof(int));
...
}
free(ptr);
}例
結果情報
| グループ: 動的メモリ |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: MEM_LEAK |
| 影響度: Medium |
バージョン履歴
R2013b で導入