Setjmp, longjmp, malloc - как бороться с утечкой памяти - C (СИ)

Формулировка задачи:

Здравствуйте! Вот небольшой тестовый пример, в котором, как я понимаю, free(buf) никогда не выполнится. exit(...) борится только с незакрытыми дескрипторами. Следовательно, утечка памяти. Как корректно обработать такую ситуацию? На ум приходит только обертки для malloc/free, которые будут запоминать что они выделяли/освобождали.
#include <setjmp.h>
#include <stdlib.h>
 
jmp_buf jmp_buffer;
 
void f2()
{
    longjmp(jmp_buffer, 1);
}
 
void f1()
{
    char *buf = (char *)malloc(5);
 
    f2();
 
    free(buf);
}
 
int main(int argc, const char *argv[])
{
    if (setjmp(jmp_buffer) != 0) {
        exit(EXIT_FAILURE);
    }
 
    f1();
 
    exit(EXIT_SUCCESS);
}

Код к задаче: «Setjmp, longjmp, malloc - как бороться с утечкой памяти - C (СИ)»

textual
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
 
jmp_buf jmp_buffer;
 
/* -------------------------------- */
 
static char *buf = NULL;
 
static void init_buf (void)
{
  buf = (char*) malloc (5);
  printf ("init buf\n");
}
 
static void close_buf (void)
{
  printf ("close buf\n");
 
  if (buf == NULL)
    return;
 
  printf ("real close buf\n");
  free (buf);
}
 
/* -------------------------------- */
 
void f2()
{
    longjmp(jmp_buffer, 1);
}
 
void f1()
{
    init_buf();
 
    f2();
 
    close_buf(); /* <------ раз */
}
 
int main(int argc, const char *argv[])
{
    if (setjmp(jmp_buffer) != 0) {
        close_buf(); /* <------ два */
        exit(EXIT_FAILURE);
    }
 
    f1();
 
    exit(EXIT_SUCCESS);
}

8   голосов, оценка 3.625 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы
Для поиска решения или похожих решений вы можете воспользоваться "Поиском по сайту" или "Поиском по разделу"
Поиск по сайту