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

visual How to free reallocated memory? C++

本文关键字:C++ 分配 内存 何释放 释放 visual 新分配      更新时间:2023-10-16

我试图释放重新分配的内存,但遇到错误。。。

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视觉工作室向我展示了以下文件:

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++,您应该完全避免使用mallocfree,而使用std::vector<float>

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

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调用成功地扩展了该调用分配给malloc的内存。在这种情况下,foobar都将指向同一个内存地址,并且在尝试free bar之前,您在某个位置使用freefoo,从而导致双重删除。

您根本不需要free( foo ),因为如果在重新分配期间移动了内存区域,realloc将为您执行此操作。从链接页面:

如果所指向的区域被移动,则完成空闲(ptr)。

将指针传递给realloc()后,它将被正式释放(释放),并且不能再次释放它。

C99§7.20.3.4 realloc函数

2 realloc函数释放ptr指向的旧对象,并返回指向具有由大小指定的大小的新对象的指针。新的内容对象应与解除分配前的旧对象相同,以较小者为准新的和旧的尺寸。新对象中超出旧对象大小的任何字节都具有不确定值。

realloc()可能会返回与给定的指针相同的指针,但您不能假设它通常会返回。一旦将指针传递给realloc()(或free()),就必须假设它不再是有效的指针。

C++中的规则基本相同;它结合了用于来自C的函数(例如CCD_ 21)的C89标准。

您的系统抱怨您正在释放未分配的内存是正确的。