30

realloc が失敗して NULL が返された場合、以前のバッファは解放されていますか、それともそのまま保持されていますか? マニュアルページにその特定の情報が見つかりませんでした。どうすればよいかわかりません。メモリが解放されている場合、二重解放は危険です。そうしないと、漏れが発生します。

4

4 に答える 4

31

いいえ、違います。次のものを使用することはできないため、その側面はしばしば私を悩ませてきました。

if ((buff = realloc (buff, newsize)) == NULL)
    return;

失敗時にオリジナルを解放したい場合は、コードで。代わりに、次のようなことをする必要があります:

if ((newbuff = realloc (buff, newsize)) == NULL) {
    free (buff);
    return;
}
buff = newbuff;

もちろん、失敗時に元のバッファをそのまま保持することの理論的根拠は理解していますが、私のユースケースは十分にポップアップしているため、通常はそのケースを処理するために独自の関数をコーディングしています。

// Attempt re-allocation. If fail, free old buffer, return NULL.

static void *reallocFreeOnFail (void *oldbuff, size_t sz) {
    void *newbuff = realloc (oldbuff, sz);
    if (newbuff == NULL) free (oldbuff);
    return newbuff;
}

// Attempt re-allocation. If fail, return original buffer.
// Variable ok is set true/false based on success of re-allocation.

static void *reallocLeaveOnFail (void *oldbuff, size_t sz, int *ok) {
    void *newbuff = realloc (oldbuff, sz);
    if (newbuff == NULL) {
        *ok = 0;
        return oldbuff;
    }

    *ok = 1;
    return newbuff;
}

C11標準状態の関連セクション(私のイタリック体):

7.20.3.4realloc関数

ptrが null ポインターの場合、関数は指定されたサイズreallocの関数のように動作します。mallocそれ以外の場合、、、または関数ptrによって以前に返されたポインタと一致しない 場合、またはまたは関数の呼び出しによって領域の割り当てが解除された場合、動作は未定義です。新しいオブジェクトのメモリを割り当てることができない場合、古いオブジェクトは割り当て解除されず、その値は変更されません。callocmallocreallocfreerealloc

于 2009-10-22T13:01:33.927 に答える
5

realloc()は、新しく割り当てられたメモリへのポインタを返します。これは、あらゆる種類の変数に対して適切に配置され、 とは異なる場合があります。ptrまたはNULL、リクエストが失敗した場合。sizeが 0 の場合は、NULLまたは渡されるのに適したポインターfree()が返されます。失敗した場合realloc()、元のブロックはそのまま残ります。解放または移動されません。

malloc(3)- Linux のマニュアル ページ

于 2009-10-22T12:58:05.913 に答える
2

いいえ。失敗した場合、元のバッファの変更は行われませrealloc()ん。

realloc(3):

realloc()は、新しく割り当てられたメモリへのポインタを返します。これは、あらゆる種類の変数に対して適切に配置され、 とは異なる場合があります。ptrまたはNULL、リクエストが失敗した場合。size が 0 の場合は、NULLまたは渡されるのに適したポインター free() が返されます。失敗した場合realloc()、元のブロックはそのまま残ります。解放または移動されません。

于 2009-10-22T13:05:43.393 に答える
0

いいえ、しません。Realloc の変更は、malloc または calloc によって割り当てられた動的メモリを増減します。メモリの増加中に realloc が失敗した場合は NULL を返しますが、以前に割り当てられたメモリは変更されません。Realloc は、以前に割り当てられたメモリのベース アドレスから新しいメモリ割り当てを計算するため、メモリに対して操作を実行しません。

于 2016-07-02T04:05:01.987 に答える