FireZone
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору OrlangurStep Каждому New должен соответствовать свой Dispose (хоть в той же процедуре, хоть в любой другой, главное, чтобы другая имела доступ к указателю на память, выделенную тем New). Аналогично, каждому GetMem должен соответствовать свой FreeMem, каждому Create свой Free. Другими словами, память, выделенная руками в некоторой процедуре, автоматически не освобождается при выходе из этой процедуры. А вот доступ к этой памяти можно и потерять, если указатели на выделяемую память были объявлены локально и никуда наружу не присваивались. Вот иллюстрация: Код: var g_ptr: Pointer = nil; procedure Test1; var loc_ptr, loc_ptr1: Pointer; begin if g_ptr = nil then begin GetMem(loc_ptr, 10); g_ptr := loc_ptr; end; loc_ptr := nil; // совершенно лишняя операция в данном случае GetMem(loc_ptr1, 10); //доступ к этой памяти мы потеряем и не сможем её освободить end; procedure Test2; begin if g_ptr <> nil then begin FreeMem(g_ptr); g_ptr := nil //если не очистим указатель, появится шанс нарваться на повторный FreeMem, что приведёт к ошибке end end; |
|