C6308
警告 C6308: 'realloc' は null ポインターを返す可能性があります: null ポインターを、引数として 'realloc' へ渡された <変数> に割り当てると、元のメモリ ブロックにメモリ リークを発生させる原因となります
この警告は、再割り当て関数が不適切に使用された結果としてメモリ リークが発生することを示します。ヒープ再割り当て関数は、再割り当てが失敗した場合は渡されたバッファーを解放しません。問題を修正するには、再割り当て関数の結果を一時変数に代入し、再割り当てが成功した後で元のポインターを置換します。
使用例
この警告が発生するコード例を次に示します。
#include <malloc.h>
#include <windows.h>
void f( )
{
char *x;
x = (char *) malloc(10);
if (x != NULL)
{
x = (char *) realloc(x, 512);
// code...
free(x);
}
}
この警告を解決するには、次のコードを使用します。
#include <malloc.h>
#include <windows.h>
void f()
{
char *x, *tmp;
x = (char *) malloc(10);
if (x != NULL)
{
tmp = (char *) realloc(x,512);
if (tmp != NULL)
{
x = tmp;
}
free(x);
}
}
この警告は、再割り当て関数の結果を割り当てるときに、再割り当てされるバッファーのライブ エイリアスがある場合、音を鳴らすことができます。
これらの問題を完全に回避するには、C++ の標準テンプレート ライブラリ (STL) によって提供される機構を使用します。これには、shared_ptr、unique_ptr、vector などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。