@kurator88 @danilax86 что-то вроде:
R* result = ERROR;
A* a = create_a_or_fail();
if (!a) goto cleanup_a;
B* b = create_b_or_fail();
if (!b) goto cleanup_b();
C* c = get_c_or_fail();
if (!c) goto cleanup_c;
result = do_stuff(a, b, c);
cleanup_c:
destroy_c(c);
cleanup_b:
destroy_b(b);
cleanup_a:
destroy_a(a);
return result;
@kurator88 @danilax86 не жди, что этот код без багов, сам на си тоже давно не писал :)
В целом, для корректного сбора ресурсов, который в других языках делают деструкторы или финализаторы или defer. Освободить ресурсы в правильном порядке, при этом без double free и без дублирования кода.