16 февраля 2012 г.

Всегда обнуляйте записи

Очередная аксиома программирования. Вы сильно облегчите себе жизнь, если первой строкой всегда будет инициализация записи. Даже если это излишне, даже если запись — ваша, и вы всегда означиваете её поля.

Всегда обнуляйте. Точка.

Сделать это очень просто, используйте либо функцию FillChar, либо ZeroMemory. Я использую второй вариант, поскольку первый вызывает неоднозначные ассоциации. Тем не менее, рассмотрим оба варианта.

FillChar:
FillChar(Rec, SizeOf(Rec), 0);
ZeroMemory:
ZeroMemory(@Rec, SizeOf(Rec));

Оба варианта выполняют одно и то же, обнуляют участок памяти.

Теперь расскажу, почему так важно это делать. При объявлении локального идентификатора типа запись не производится его автоматическая инициализация, поля заполнены мусором (за исключением управляемых). В подавляющем большинстве случаев это абсолютно неважно, так как либо ни на что не влияет, либо программистом производится полная инициализация записи перед её использованием. Зато иногда…

Не так давно я напоролся на то, что в Windows XP стабильно генерировалась ошибка доступа к памяти (Access violation), хотя в Windows 7 всё замечательно работало. Причина банальна: я не обнулил запись перед вызовом API-функции SHBrowseForFolder. В семерке это не сказалось, в XP стало фатальным.

Комментариев нет:

Отправить комментарий