img
00:00
imgDRKB online - Как избежать использования неактуальных указателей
imgimgimg
  Общие вопросы
  Delphi IDE, компиллятор, отладчик, редактор
  Язык программирования Дельфи
  Общие вопросы
  Объектное ориентирование
  Работа со строками
  Работа с датами и временем
  Работа с числами
  Работа с битами
  Работа с массивами
  Работа с указателями, память
  Арифметика указателей
  Использование указателей на целое
  Как избежать использования неактуальных указателей
  Пример работы с указателями
  Получение ссылки на экземпляр класса
  Method pointers --> function pointers
  Быстрое сравнение памяти
  Динамическое распределение памяти
  StrAlloc и GetMem
  Освобождение памяти
  Очистить переменную в оперативной памяти
  Получение размера памяти выделенный под Pointer
  Потеря памяти
  Принципы работы с памятью в системе Windows32
  Linked List Memory Table
  Увеличение значения указателя
  Указатель на вариантный тип
  Указатель на функцию
  Функции для выделения, перераспределения и освобождения памяти
  Множества, записи и перечисляемые типы
  RTTI и другие трюки с информацией о классах, модулях и т.п.
  Взаимодействие с другими языками
  Threads
  Работа с коллекциями
  RTL Delphi (краткий справочник)
  Базовые классы
  Скрипты, компилляторы и связанные с ними вопросы
  Вокруг и около Паскаля или другие компилляторы Дельфи/Паскаль
  VCL
  Системные функции и WinAPI
  Базы данных
  Работа с файловой системой
  Репортинг, работа с принтером
  Работа с сетью, интернетом, протоколами
  Работа с графикой и мультимедиа
  Математика, алгоритмы
  Форматы файлов, данных. Конвертация форматов
  ActiveX, COM, DCOM, MIDAS, CORBA, интерфейсы, OLE, DDE
  Разработка приложений
  Kylix
  Delphi.Net
  Развлечения
  
  [drkb=322] Комментариев: 0 
Как избежать использования неактуальных указателей


Я создал простой модуль и разработал несколько простых методов, помогающих избежать использования неактуальных (в оригинале было "stale" - черствый, несвежий) указателей. Я настоятельно рекомендую добавить во все модули, содержащие указатели или объектные переменные секцию инициализации ('initialization') и установить все указатели (объектные переменные это те же реальные указатели) в nil. Что это даст: прежде чем хотя бы один указатель будет использован, он обязательно будет проверен, освобожден и установлен в nil. Затем, после освобождения указателей, просто установите их в nil. Мой модуль содержит функцию Nilify() для установки указателей в nil, а также специальные версии методов Free, Dispose, и FreeMem (названные NilXXX) для проверки значения nil перед освобождением памяти, и установления указателя в nil сразу после того, как он был освобожден. Я также включил специальную версию Assigned(), названную IsNil(), которая вместо переменного (var) параметра получает константу, которую вы можете затем использовать в своих свойствах, и т.п.
Этот модуль, конечно, ничего не делает с VCL, но тем не менее вы можете иметь неактуальные указатели и с VCL... Строгое соблюдение функций модуля сделает вас уверенным в отсутствии ошибок при работе с указателями. Единственное условие использования модуля - в случае любых изменений кода с вашей стороны или наличия каких-либо замечаний или предложений пришлите их пожалуйста мне. Пользуйтесь на здоровье!

delphi
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
    begin
      o.Free;
      Nilify(o);
    end;
end;

procedure NilDispose(var p: Pointer);
begin
  if not IsNil(p) then
    begin
      Dispose(p);
      Nilify(p);
    end;
end;

procedure NilFreeMem(var p: Pointer; size: Word);
begin
  if not IsNil(p) then
    begin
      FreeMem(p, size);
      Nilify(p);
    end;
end;

end.



@Drkb::00254
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Количество статей: 4366
 
Вход
Имя:
Пароль:
Запомнить
Регистрация Забыли пароль?
Мини-чат :)
Необходима регистрация
Архив мини-чата
18-07-2019 11:26
kuzyara
drkb online должен жить!
долгих лет автору сайта!
03-07-2019 16:00
Programmer
Привет
19-06-2019 23:35
Eri
Всем привет!!
16-06-2019 20:14
Programmer
спустя 10 дней
06-06-2019 20:41
Programmer
Летоооо
23-04-2019 18:44
Programmer
уже конец апреля. Через март, карл!
19-03-2019 08:21
antonn
Быстро время летит smiley
18-03-2019 09:43
Programmer
ыы уже март
14-01-2019 19:13
Programmer
Аахахаха общаемся через время
14-01-2019 19:13
Programmer
Нет
Статистика
 СегодняВсего
Посетителей3092070566
Запросов31209319869536
Online
Пользователей0
Гостей21
imgimgimgimg
 
img
     00:00