如何释放重新分配的内存?C++

Joh*_*Ace 8 c++ memory visual-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
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:http://d.pr/mpBF和visual studio向我显示以下文件:

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

有任何想法吗?

Dav*_*nan 6

foo = (float *)malloc( a * 2 * sizeof(float));
bar = (float *)realloc( foo, a * 2 * sizeof(float));
free( foo ); // oops, foo has gone
Run Code Online (Sandbox Code Playgroud)

在您调用时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;
Run Code Online (Sandbox Code Playgroud)

当然,因为这是C++,你应该避免mallocfree完全使用std::vector<float>.


bam*_*s53 2

当您重新分配内存时,不应释放旧内存。

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

你要:

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);
}
Run Code Online (Sandbox Code Playgroud)