Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TStringlist и его Try и Finally


Автор: Canada 24.3.2009, 15:15
Вот http://forum.vingrad.ru/topic-174701.html я почитал, но МеталФан был прав..У новичка (у меня) после прочтения - каша в голове.

Я это к тому, что вот я не использовал Try и Finally, а работал с переменной типа TStringList Как с обычным мемо. И все работает! А ведь THandle, еще и .Free использует! 
Меня как новичка интересует такие вопросы:

1) А что будет если не использовать эти Try и Finally?Т.е. если я на 100% уверен, что ошибки в коде не будет. 

2) А вот без .Free я так понимаю, эта переменная типа ТСтрингЛист так и останется в памяти? 

3) А можно .Free использовать без Try и Finally?

Автор: CodeMonkey 24.3.2009, 15:33
Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
 А что будет если не использовать эти Try и Finally?

try/finally - это своего рода ремни и подушка безопасности. Последствия НЕ использования - можете представить сами.

Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
Т.е. если я на 100% уверен, что ошибки в коде не будет.

Вы не можете быть на 100% уверены.

Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
А вот без .Free я так понимаю, эта переменная типа ТСтрингЛист так и останется в памяти? 

Free удаляет объект (вызывает деситруктор). Если объект не удалять - он останется висеть до конца программы. Обычно это называют утечкой памяти. Это не очень страшо в клиентских программах (да, это - баг, это - плохо, но это терпимо), а для серверных - вот http://transl-gunsmoker.blogspot.com/2009/03/blog-post_06.html.
Самое обычное правило просто: кто объект создал - тот его и удаляет. Если вы его создавали - вы и обязаны его удалить. Но, конечно же, из этого правила есть вполне очевидные исключения.

Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
А можно .Free использовать без Try и Finally?

Можно. Но ремней безопасности уже не будет.

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392.

Автор: MetalFan 24.3.2009, 15:37
Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
Т.е. если я на 100% уверен, что ошибки в коде не будет. 

на 100% ни в чем нельзя быть уверенным. если ты думаешь, что уверен на 100%, значит ты что-то еще не знаешь и не учитываешь ;)

и еще бы неплохо привести куски кода, чтобы было ясно, о чем речь, без захода по ссылке.

Автор: vladimir74 24.3.2009, 15:40
Цитата(Canada @  24.3.2009,  13:15 Найти цитируемый пост)
1) А что будет если не использовать эти Try и Finally?Т.е. если я на 100% уверен, что ошибки в коде не будет. 

ничего не будет, пока не возникнет ошибка smile

Цитата(Canada @  24.3.2009,  13:15 Найти цитируемый пост)
2) А вот без .Free я так понимаю, эта переменная типа ТСтрингЛист так и останется в памяти? 

да, но только до тех пор пока деструктор не решит ешо уничтожить. Например при закрытии программы

Цитата(Canada @  24.3.2009,  13:15 Найти цитируемый пост)
3) А можно .Free использовать без Try и Finally? 

можно

Добавлено через 56 секунд
Цитата(MetalFan @  24.3.2009,  13:37 Найти цитируемый пост)
и еще бы неплохо привести куски кода, чтобы было ясно, о чем речь, без захода по ссылке.

во smile пока прочитал тот топик, уже трое ответили...

Добавлено через 1 минуту и 42 секунды
к пункту 3 ...
можно, но не нужно... ;)

Автор: Canada 24.3.2009, 22:09
Кусок кода, это выйдет всю программу выкладывать.Т.е. я просил объяснить принцип работы, и вы это сделали на Отлично!. Дело в том, что у меня не было проблемы еще с этим. Но смысл я уже на практике понял. Спасибо вам огромное! Т.е. я ообще с TStringList раньше не работал..Спасибо!

Автор: CodeMonkey 25.3.2009, 10:04
TStringList тут как-бы вообще ни при чём. Это общие принципы/правила.

Автор: THandle 25.3.2009, 16:45
Попробуй два кода(самый примитив, что пришло в голову сейчас...) вне среды(не в Delphi, а просто в Windows):

Код

procedure TForm2.Button1Click(Sender: TObject);
var
  S: TStringList;
begin
  S := TStringList.Create;
  try
    S.Add('SomeTest');
    ShowMessage(S[S.Count]);
  finally
    S.Free;
    ShowMessage('Msg');
  end;
end;


Код

procedure TForm2.Button1Click(Sender: TObject);
var
  S: TStringList;
begin
  S := TStringList.Create;
  S.Add('SomeTest');
  ShowMessage(S[S.Count]);
  S.Free;
  ShowMessage('Msg');
end;

Автор: Kbl4AH 25.3.2009, 20:57
THandle, пример наглядный, попробовал... smile 
Теперь стало понятно окончательно...

Автор: Poseidon 26.3.2009, 13:20
Цитата(Canada @  24.3.2009,  15:15 Найти цитируемый пост)
если я на 100% уверен, что ошибки в коде не будет.
Есть такая коварная ошибка, которая может возникнуть где угодно и по коду и не скажешь что она именно тут может возникнуть. Завется она "Out of memory". Быть на 100% уверенным что этой ошибки не возникнет невозможно, ведь помимо твоей программы в ОС выполняется еще куча всего и знать заранее сколько кому нужно будет памяти и сколько вообще памяти на компе невозможно.

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