应该在longjmp()之后调用free()吗?

时间:2015-02-12 08:43:19

标签: c memory-leaks malloc free longjmp

在这个简单的代码中,我应该注意默认情况下的内存释放以逃避内存泄漏,还是可以使用已分配的内存? 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;
}

3 个答案:

答案 0 :(得分:3)

longjmp将恢复“堆栈”变量的(在本例中为“p”)。但是,在此示例中存在两个问题:

  • 在默认情况下,p尚未分配值,释放它将是一个错误。
  • 如果示例显示p被分配了一个示例,则内存泄漏仍然无法修复,因为longjmp无法对此做任何事情。

答案 1 :(得分:2)

不,longjmp不会还原动态内存分配。

答案 2 :(得分:0)

longjmp() 不会为您释放内存,因此您必须手动free()。这是使用setjmp() / longjmp()来转义深层调用堆栈的复杂性之一,因为您必须担心清理任何父函数使用的资源。请注意,在您的示例中,必须p声明为volatileint *volatile p = NULL;),以防止它被longjmp()破坏,因为它&在setjmp()电话后修改了#39;有关解释,请参阅here