LINUX.ORG.RU

try-finally - освобождение ресурса (fpc/lazarus)

 ,


1

2

добрый день разбираю чужой код, наткнулся на «его непонимание»

begin
var ResponceStream := PostRequest(UrlCtrl + '/api/hello', PostSource);
try
// here void
finally
  ResponceStream.Free;
  end;
end;

задал вопрос автору:

смысл использовать т.о. try-finally? если что-то случаться в процессе отправки запроса, то не произойдет «дефолтного» освобождения рессурса

получил ответ:

наоборот обязательно произойдет освобождение

поясните, почему? :о)

спасибо!

p.s. данный код из Delphi-проекта, переношу на Lazarus

★★★★★

Последнее исправление: sunjob (всего исправлений: 2)
var
  ResponseStrem  : TResponseStream;
begin

  try
    ResponceStream := PostRequest(UrlCtrl + '/api/hello', PostSource);
  finally
    if Assigned(ResponseStream)  
      then FreeAndNil(ResponseStream);
  end;

end;

man-from-36
()
Последнее исправление: man-from-36 (всего исправлений: 1)
Ответ на: комментарий от man-from-36

Проверка Assigned не имеет смысла - FreeAndNil сам делает такую проверку.

Переменная ResponseStream после FreeAndNil не используется - FreeAndNil избыточен и может быть заменен на простой Free.

При возникновении исключения в PostRequest значение переменной ResponseStream присвоено не будет и в ней останется случайный мусор из стека, условие Assigned сработает и FreeAndNil будет освобождать память по случайному указателю.

No ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.