次の方法で共有


警告 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++ 標準ライブラリ」を参照してください。

関連項目

警告 C6014