【发布时间】:2015-02-12 08:43:18
【问题描述】:
在这个简单的代码中,我应该注意在默认情况下释放内存以逃避内存泄漏还是可以使用分配的内存? longjmp 是否也恢复内存分配?
#include <setjmp.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, const char* argv)
{
jmp_buf jmpbuf;
int *p=NULL;
switch(setjmp(jmpbuf)){
case 0:
p=(int *) malloc(10*sizeof(int));
printf("%p\n",p);
longjmp(jmpbuf,1);
break;
default:
printf("%p\n",p);
free(p);
}
return 0;
}
【问题讨论】:
-
您应该初始化
p = NULL以确保对free()的调用不会失败,即使从未调用过p = malloc(...)。 -
我已经更正了声明,所以 p 被初始化为 NULL。在第一次尝试时,它总是 case 0 并打印分配的地址,但在第二次尝试时,p 仍然指向旧的分配位置而不是 NULL。我还尝试在 switch 和 case 0 语句之间移动 int *p=NULL 。那么可以免费拨打电话吗?它不应该是NULL吗?我正在使用 gcc 4.8 对其进行测试。
-
据我所知,寄存器是存储实际值的存储地址,恢复寄存器不会恢复内存中的值。有人如何确定值没有存储在寄存器而不是内存中?
-
malloc()仅从堆中分配内存。
标签: c memory-leaks malloc free setjmp