записки хакера КРИС КАСПЕРСКИ Спецвыпуск: Хакер, номер #071, стр. 071-112-2 [обработка ошибки выделения памяти.] Постоянная проверка успешности выполнения интенсивно используемых функций во-первых, слишком утомительна, во-вторых, загромождает исходный текст, и, в-третьих, приводит к неоправданному увеличению объема откомпилированного кода программы. char *p; p = malloc(BLOCK_SIZE); if (p==0) { fprintf(stderr,"-ERR: недостаточно памяти для продолжения операци\n"); _exit(); } Кстати говоря, следующий код «p = malloc(x); if (!p) return 0;» даже хуже, чем отсутствие проверки вообще, так как при обращении к нулевому указателю Windows хоть выругается, указав на место сбоя, а такая кривая проверка просто тихо кончит программу... Решение заключается в создании «оберток» для интенсивно используемых функций, проверяющих успешность завершения вызываемой ими функции и при необходимости рапортующих об ошибке с завершением программы или передающих управление соответствующему обработчику данной аварийной ситуации. void* my_malloc(int x) { int *z; z=malloc(x); if (!z) GlobalError_and_save } Между прочим, виртуальная память не безгранична и иногда она неожиданно кончается. Попытка выделения нового блока посредством malloc дает ошибку. В этой ситуации очень важно корректно сохранить все несохраненные данные и выйти. А как быть, если для сохранения требуется определенное количество памяти? Да очень просто! При старте программы выделяем malloc'ом столько памяти, сколько ее может потребоваться для аварийного сохранения. Если нас обломают на память, то просто не запускаемся, а с ругательством сваливаем. Затем, при нехватке памяти просто сохраняемся (необходимая память у нас есть) и все!!! |