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」) の変数のを復元します。ただし、この例には 2 つの問題があります。

  • デフォルトの場合、p には値が割り当てられておらず、解放するとエラーになります。
  • 例が p に例が割り当てられていることを示している場合、longjmp はそれについて何もできないため、メモリ リークは修正されません。
于 2015-02-12T09:07:04.863 に答える
2

いいえ、longjmp動的メモリ割り当てを元に戻しません。

于 2015-02-12T08:47:38.307 に答える
0

longjmp() メモリの割り当てを解除しないfree()ため、手動で行う必要があります。親関数のいずれかによって使用されるリソースをクリーンアップすることを心配する必要があるため、これはsetjmp()/を使用して深い呼び出しスタックをエスケープする際の複雑さの 1 つです。longjmp()あなたの例では、as ( ) を宣言して、呼び出し後に変更されるため、によって上書きされる可能性を防ぐ必要があることに注意してください (説明については、こちらを参照してください)。pvolatileint *volatile p = NULL;longjmp()setjmp()

于 2015-07-12T15:42:34.857 に答える