фрагмент типичной программы, страдающей утечками ресурсов
Функция foo
намеревается выделить два блока памяти p1 и p2, но реально успевает выделить лишь один из них, после чего bar
завершается с ошибкой, делающей дальнейшее выполнение foo
невозможным, вот программист и совершает возврат по return, забывая о выделенном блоке памяти.
Проблема в том, что в произвольной точке программы очень непросто сказать: какие ресурсы уже выделены, а какие еще нет и что именно нужно освобождать! Ну ведь не поддерживать же ради этого транзакции?! Разумеется, нет. Проблема имеет весьма простое и элегантное решение, основанное на том, что Стандарт допускает освобождение нулевого указателя. Правда, к файлам и другим объектам это уже не относится, но проверку на нуль легко выполнить и вручную.
Правильно спроектированный код должен выглядеть приблизительно так:
foo()
{
int error = 0;
FILE *ff = 0;
char *p1 = 0; char *p2 = 0;
{
p1 = malloc(XXL);
ff = fopen(FN,"r");
…
if ((bar()==ERROR) && (error=-1)) break;
…
p2 = malloc(XXL);
…
} while(0);
free(p1);
free(p2);
if (ff) fclose(ff);
return error;
}