084be3a8

фрагмент типичной программы, страдающей утечками ресурсов


Функция 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;

}



Содержание раздела