3

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

3 回答 3

3

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

  • 在默认情况下,p 没有被赋值,释放它是一个错误。
  • 如果该示例显示为 p 分配了一个示例,则内存泄漏仍然无法修复,因为 longjmp 对此无能为力。
于 2015-02-12T09:07:04.863 回答
2

不,longjmp不会恢复动态内存分配。

于 2015-02-12T08:47:38.307 回答
0

longjmp() 不会为您释放内存,因此您必须free()手动分配。这是使用setjmp()/longjmp()来逃避深度调用堆栈的复杂性之一,因为您必须担心清理任何父函数使用的资源。请注意,在您的示例中,您必须声明pvolatile( int *volatile p = NULL;) 以防止它可能被 破坏longjmp(),因为它在setjmp()调用后被修改(请参阅此处以获取解释)。

于 2015-07-12T15:42:34.857 回答