Привет, ЛОР!
Я тут тебе немного покушать принёс. Как ты, наверное знаешь, не за горами выход нового стандарта языка C – C23. Среди прочих вкусностей, таких как лямбды в стиле C++, в этот стандарт предложено добавить механизм defer, аналогичный существующему в языке Go.
Ссылка на предложение: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm
В случае, если этот стандарт будет принят, будет возможно написание вот такого кода:
p = malloc(N);
defer { free(p); }
Где аргументом оператора defer
является анонимная функция. Так же возможны более сложные варианты использования:
enum { initial = 16, };
double buffer[initial] = { 0 };
...
size_t elements = 0;
double* q = buffer;
defer [orig = q, &q]{ if (orig != q) { free(q); }};
...
// increase elements somehow
...
// adjust the buffer
if (elements > initial) {
double* pp = (q == buffer) ? malloc(sizeof(double[elements])) : realloc(q, sizeof(double[elements]));
if (!pp) return EXIT_FAILURE;
q = pp;
}
...
Учитывая всё это, скоро в C больше не будет нужно использовать goto вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!