簡體   English   中英

如何釋放重新分配的內存? C ++

[英]How to free reallocated memory? C++

我正在嘗試釋放重新分配的內存但我收到錯誤...

float * foo = NULL;
float * bar = NULL;

void update()
{
    ...
    foo = (float *)malloc( a * 2 * sizeof(float));
    ...
    bar = (float *)realloc( foo, a * 2 * sizeof(float));
    ...
    free( foo );
    ...
    // when i do
    if(bar != NULL)
    {
        free(bar); // <-- error at executing
    }
}

我收到錯誤: http//d.pr/mpBF和visual studio向我顯示以下文件:

osfinfo.c
=========
void __cdecl _unlock_fhandle (
        int fh
        )
{
        LeaveCriticalSection( &(_pioinfo(fh)->lock) );
}

有任何想法嗎?

foo = (float *)malloc( a * 2 * sizeof(float));
bar = (float *)realloc( foo, a * 2 * sizeof(float));
free( foo ); // oops, foo has gone

在你調用free(foo)foo是無效的,因為當你調用realloc時它已經被釋放了。

代碼應該像這樣的偽代碼:

foo = (float *)malloc( a * 2 * sizeof(float));
if (foo == NULL) 
    return ERROR_CODE;
...
bar = (float *)realloc( foo, a * 2 * sizeof(float));
if (bar == NULL) 
{
    free(foo);
    return ERROR_CODE;
}
...
free(bar);
return SUCCESS;

當然,因為這是C ++,你應該避免使用malloc並完全free並使用std::vector<float>

我的猜測是realloc調用設法擴展調用malloc分配的malloc 在這種情況下, foobar都將指向相同的內存地址,並且在嘗試free bar之前,您可以在某處free foo ,從而導致雙重刪除。

您根本不需要free( foo )因為如果在重新分配期間移動了內存區域, realloc將為您執行此操作。 從鏈接頁面:

如果指向的區域被移動,則完成自由(ptr)。

重新分配內存時,不應釋放舊內存。

bar = (float *)realloc( foo, a * 2 * sizeof(float));
free( foo ); // <-- this is wrong

你要:

float * foo = NULL;

void update()
{
    ...
    foo = (float *)malloc( a * 2 * sizeof(float));
    ...
    float * bar = (float *)realloc( foo, a * 2 * sizeof(float));
    if(bar)
       foo = bar;
    ...
    free(foo);
}

一旦你傳遞了一個指向realloc()的指針,它就會被正式釋放(釋放),你不能再釋放它。

C99§7.20.3.4重新分配功能

2 realloc函數釋放ptr指向的舊對象,並返回指向具有size指定大小的新對象的指針。 新對象的內容應與解除分配之前的舊對象的內容相同,直到新舊大小中的較小者為止。 新對象中超出舊對象大小的任何字節都具有不確定的值。

可能會發生realloc()返回與給定的指針相同的指針,但您不能認為它通常會發生。 一旦你傳遞了一個指向realloc() (或free() )的指針,你必須假設它不再是一個有效的指針。

C ++中的規則基本相同; 它結合了C語言的C89標准,如realloc()

你的系統抱怨你正在釋放未分配的內存是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM