Этот модуль, конечно, ничего не делает с VCL, но тем не менее вы можете иметь неактуальные указатели и с VCL... Строгое соблюдение функций модуля сделает вас уверенным в отсутствии ошибок при работе с указателями. Единственное условие использования модуля - в случае любых изменений кода с вашей стороны или наличия каких-либо замечаний или предложений пришлите их пожалуйста мне. Пользуйтесь на здоровье!
unit Pointers; { Автор: David S. Becker (dsb@plaza.ds.adp.com)Дата: 1/27/97Авторские права: НетДистрибутивные права: Свободные, неограниченное использование, в случае любых изменений кодас вашей стороны или наличия каких-либо замечаний или предложений пришлите их пожалуйста мне. Данный модуль создавался для помощи в управлении указателями и объектами. Так каккомпилятор не инициализирует указатели и объекты в nil и не сбрасываетих в nil при освобождении, существует вероятность применения неактуальногоуказателя. По этой причине я рекомендую добавление секции 'initialization'во все модули и вызове Nilify() для всех указателей/объектов в данном модуле.Это позволит быть уверенным, что все указатели/объекты стартуют как nil.Кроме того, вместо стандартных аналогов, вы можете использовать NilFree(для объектов), NilDispose (для указателей, создаваемых с помощью New),и NilFreeMem (для указателей, создаваемых с помощью GetMem). Эти процедурыбезопасны при вызове nil-вых указателей/объектов, так как перед выполнениемлюбых действий они проверяют их на nil. После освобождения распределеннойуказателем/объектом памяти они сбрасываются в nil. Строгое соблюдение функциймодуля значительно снижает риск использования неактуального указателя.(Конечно, вы еще можете получить неактуальные указатели из VCL, т.к.они, естественно, не используют данные функции.)} {==============================================================================} interface {------------------------------------------------------------------------------} { Проверка указателя на nil } { ПРИМЕЧАНИЕ: Данная функция отличается от Assigned() тем, что Assigned() } { требует переменную, а IsNil() нет. } function IsNil(const p: Pointer): Boolean; { Устанавливает указатель в nil } procedure Nilify(var p); { Освобождает не-nil объект и устанавливает его в nil } procedure NilFree(o: TObject); { Освобождает не-nil указатель, созданный с помощью New и устанавливает его в nil } procedure NilDispose(var p: Pointer); { Освобождает не-nil указатель и устанавливает его в nil } procedure NilFreeMem(var p: Pointer; size: Word); {==============================================================================} implementation {------------------------------------------------------------------------------} function IsNil(const p: Pointer): Boolean; begin Result := (p = nil);end; {------------------------------------------------------------------------------} procedure Nilify(var p); begin Pointer(p) := nil;end; {------------------------------------------------------------------------------} procedure NilFree(o: TObject); begin if not IsNil(o) then begino.Free;Nilify(o);end;end; {------------------------------------------------------------------------------} procedure NilDispose(var p: Pointer); begin if not IsNil(p) then beginDispose(p);Nilify(p);end;end; {------------------------------------------------------------------------------} procedure NilFreeMem(var p: Pointer; size: Word); begin if not IsNil(p) then beginFreeMem(p,size);Nilify(p);end;end; end. |
[000308]