Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сравнение кода по работе с памятью


Автор: midiar 23.10.2005, 18:56
Добрый день. Интересует вопрос о том какой код правильнее, вот три варианта:

1.
Код

...

  q:=nil; t:=nil; c:=nil;
  try
    try
      q := TADOQuery.Create(nil);
      c := TADOCommand.Create(nil);
      t := TADOTable.Create(nil);

      ...

    except
      on E: Exception do
      begin
      ...
      end;
    end;
  finally
    if t<>nil then t.Free;
    if q<>nil then q.Free;
    if c<>nil then c.Free;
  end;


2.
Код

...

  q := TADOQuery.Create(nil);
  c := TADOCommand.Create(nil);
  t := TADOTable.Create(nil);
  try
    try

      ...

    except
      on E: Exception do
      begin
      ...
      end;
    end;
  finally
    t.Free;
    q.Free;
    c.Free;
  end;


3.
Код

...

  q := TADOQuery.Create(nil);
  c := TADOCommand.Create(nil);
  t := TADOTable.Create(nil);
    try

      ...

    except
      on E: Exception do
      begin
      ...
      end;
    end;
  t.Free;
  q.Free;
  c.Free;

Автор: Poseidon 23.10.2005, 19:43
Освобождать память нужно в любом случае. Знать бы еще что скрывается за точками, но раз это не известно, то второй.

Автор: midiar 23.10.2005, 19:59
А если q было создано нормально, а при создании c или t произошла ошибка?

Автор: Poseidon 23.10.2005, 20:19
И когда это при создании компонентов происходили ошибки? На моей практике не было такого еще.

Автор: midiar 23.10.2005, 20:33
В конструкторе ADO компонентов вызывается функция CreateADOObject, которая может генерить исключение. То есть теоретически трабл может быть.

Автор: Rennigth 24.10.2005, 09:15
Цитата(Poseidon @ 23.10.2005, 20:19)
И когда это при создании компонентов происходили ошибки?

Попробуй создать TAdoConnection без предворительного Application.Initialize. smile

midiar
Я тоже задавался этим вопросом, но почему-то использую конструкцию 2.

Автор: ~FoX~ 24.10.2005, 14:15
midiar
А если почитать как работает try....except....finale?

Автор: midiar 24.10.2005, 18:23
Загадками изволите разговаривать. В этой теме загадку задал я smile

Автор: p0s0l 24.10.2005, 19:54
Третий вариант хуже второго по след. причинам:
- в случае Exit не освободится память
- в случае исключения в обработчике исключений smile (в Except-части) тоже будет облом с освобождением памяти

Второй вариант лишен этих недостатков... Но он хуже первого варианта по причине возможности исключения в конструкторах, об этом уже тут говорилось...

Поэтому среди предложенных мой выбор - первый вариант smile

PS: проверять на nil перед вызовом Free не стоит, т.к. Free это делает сам:
Код
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

PPS: теоретически возможны исключения в деструкторах smile

Автор: midiar 24.10.2005, 20:10
Генерить исключеня в деструкторах - это моветон smile

Мне первый вариант тоже больше нравится smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)