visual如何释放重新分配的内存?C++
visual 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视觉工作室向我展示了以下文件:
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>
。
当您重新分配内存时,不应该释放旧内存。
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
的内存。在这种情况下,foo
和bar
都将指向同一个内存地址,并且在尝试free
bar
之前,您在某个位置使用free
和foo
,从而导致双重删除。
您根本不需要free( foo )
,因为如果在重新分配期间移动了内存区域,realloc
将为您执行此操作。从链接页面:
如果所指向的区域被移动,则完成空闲(ptr)。
将指针传递给realloc()
后,它将被正式释放(释放),并且不能再次释放它。
C99§7.20.3.4 realloc函数
2 realloc函数释放ptr指向的旧对象,并返回指向具有由大小指定的大小的新对象的指针。新的内容对象应与解除分配前的旧对象相同,以较小者为准新的和旧的尺寸。新对象中超出旧对象大小的任何字节都具有不确定值。
realloc()
可能会返回与给定的指针相同的指针,但您不能假设它通常会返回。一旦将指针传递给realloc()
(或free()
),就必须假设它不再是有效的指针。
C++中的规则基本相同;它结合了用于来自C的函数(例如CCD_ 21)的C89标准。
您的系统抱怨您正在释放未分配的内存是正确的。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源