C6014
警告 C6014: メモリ リーク。
この警告は、指定したポインターが割り当てられているメモリを解放されていない他の割り当てられたリソースを参照していることを示します。アナライザーは、_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注釈が指定されている場合にのみこの条件をチェックします。既定では、この注釈は Windows カーネル モード (ドライバー) コードに対して指定されます。SAL 注釈の詳細については、「SAL 注釈を使って C/C++ のコード障害を減らす方法」を参照してください。
使用例
この警告が発生するコード例を次に示します。
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
}
}
int main( )
{
f();
}
次のコードは、メモリの解放して警告を解決する:
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
free(p);
}
}
int main( )
{
f();
}
この警告は、メモリやリソース リークの両方のリソースを別の場所に一般的に、エイリアス化された場合です。メモリは、関数が _Out_ パラメーター注釈、グローバル変数、または戻り値によってメモリへのポインターによってをエスケープするときにエイリアスが設定されます。この警告は、関数の終了時に報告できるため、引数が注釈が解放されると想定されてしまうからです。
コード分析がメモリ アロケーターの実際の実装を (アドレス演算子を含む) 認識されず、(多くのラッパーが認識される) がメモリの割り当てを認識しないことに注意してください。この場合、アナライザーはメモリが割り当てられた認識されず、この警告を生成しません。誤ったを中止するには、関数本体の左中かっこ { にこの行の #pragma のディレクティブを使用します。
これらの種類の潜在的なメモリ全体を回避するには、C++ の標準テンプレート ライブラリ (STL) によって提供される機能を使用します。これには、shared_ptr、unique_ptr、vector などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <memory>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
unique_ptr<int[]> p(new int[ARRAYSIZE]);
std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());
// code ...
// No need for free/delete; unique_ptr
// cleans up when out of scope.
}
int main( )
{
f();
}