我正在尝试释放重新分配的内存,但是我收到了错误...
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) );
}
有什么想法吗?
答案 0 :(得分:6)
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>
。
答案 1 :(得分:2)
我的猜测是realloc
调用设法扩展调用malloc
分配的内存。在这种情况下,foo
和bar
都会指向相同的内存地址,并且在尝试free
{之前,您在某处foo
free
bar
{1}}导致双重删除。
您根本不需要free( foo )
,因为如果在重新分配期间移动了内存区域,realloc
会为您执行此操作。从链接页面:
如果指向的区域被移动,则完成自由(ptr)。
答案 2 :(得分:2)
当你重新分配内存时,你不应该释放旧内存。
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);
}
答案 3 :(得分:1)
一旦你传递了一个指向realloc()
的指针,它就会被正式释放(释放),你不能再释放它。
C99§7.20.3.4realloc函数
2 realloc函数解除分配ptr指向的旧对象并返回一个 指向具有size指定大小的新对象的指针。新内容 在解除分配之前,对象应与旧对象的对象相同,直到较小的对象 新旧尺寸。新对象中超出旧对象大小的任何字节都有 不确定的价值观。
可能会发生realloc()
返回与给定的指针相同的指针,但您不能认为它通常会发生。一旦你传递了一个指向realloc()
(或free()
)的指针,你必须假设它不再是一个有效的指针。
C ++中的规则基本相同;它包含C语言的C89标准,例如realloc()
。
您的系统正确地抱怨您正在释放未分配的内存。