警告 C6308
'realloc' は null ポインターを返す可能性があります。'parameter-name' に null ポインターを割り当てると、引数として 'realloc' に渡され、元のメモリ ブロックがリークされます
解説
ヒープ再割り当て関数は、再割り当てが失敗した場合に渡されたバッファーを解放しません。正しく処理しないとメモリ リークが発生する可能性があります。 この問題を解決するには、再割り当て関数の結果を一時変数に割り当て、再割り当てが成功した後で元のポインターを置き換えます。
コード分析名: REALLOCLEAK
例
次のサンプル コードでは、警告 C6308 が生成されます。 この問題は、戻り値の代入に realloc
起因します x
。 失敗し、null ポインターが返された場合 realloc
、指し示されている x
元のメモリは解放されません。
#include <malloc.h>
#include <windows.h>
void f( )
{
char *x = (char *) malloc(10);
if (x != NULL)
{
x = (char *) realloc(x, 512);
// code...
free(x);
}
}
この問題を解決するには、戻り値 realloc
を格納する一時変数を作成します。 この変更により、失敗した場合 realloc
に以前に割り当てられたメモリを安全に解放できます。
#include <malloc.h>
#include <windows.h>
void f()
{
char *x = (char *) malloc(10);
if (x != NULL)
{
char *tmp = (char *) realloc(x,512);
if (tmp != NULL)
{
x = tmp;
}
// code...
free(x);
}
}
この警告は、再割り当て関数の結果の割り当て時に、バッファーに再割り当てするライブ エイリアスがある場合にノイズを生成する可能性があります。
このような問題を完全に回避するには、C++ 標準ライブラリ (STL) によって提供されるメカニズムを使用します。 これらには、次unique_ptr
のようなvector
コンテナーが含まれますshared_ptr
。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示