2012-05-11 3 views
2

У меня есть сомнение в том, что FreeAndNil - идеальный подход к удалению объекта. Я натолкнулся на коды, где-то вродеЧто является альтернативой FreeAndNil в Delphi 7?

StringList1.Free; 
StringList1 := Nil; 

используется. Является ли вышеуказанная линия излишним, или это лучший способ сделать что-то? В чем разница между этими двумя подходами?

+0

Возможный дубликат [Что предпочтительнее: Free или FreeAndNil?] (Http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil) –

+1

Я вижу, что есть отдельный SO обсуждение уже по этой теме. Таким образом, я думаю, что лучше, если он будет закрыт. – CyprUS

+0

Ну, это зависит от того, что этот вопрос. Я прочитал это как разницу между FreeAndNil и двумя строками кода в этом вопросе. Если это верно, это не обман. Какой у Вас вопрос? –

ответ

9

Строго говоря, для утилизации объекта вам нужно только позвонить Destroy. Однако, если ссылка nil, т.е. не был назначен указатель на действительный экземпляр объекта, это приведет к нарушению доступа, поэтому рекомендуется вместо этого вызвать Free, который проверяет сначала, если переданная ссылка равна нулю, и ничего не делает в этом случае. FreeAndNil сначала назначает переданную ссылку на временную локальную переменную, затем присваивает nil переданной ссылке, затем вызывает Free для удаления экземпляра. Единственная разница между FreeAndNil и вашей последовательностью obj.Free; obj := nil; заключается в том, что в первом случае пройденная ссылка будет nil, даже если деструктор вызывает исключение.

+0

Обратите внимание, что FreeAndNil на самом деле NilThenFree внутри, порядок может быть важен в некоторых случаях. – Kromster

5

Код на ваш вопрос, вероятно, написан кем-то, кто не знает о FreeAndNil. Или, возможно, это было первоначально написано до того, как FreeAndNil был добавлен в RTL. Если вы хотите использовать ссылку, то вы можете использовать FreeAndNil. Записывать его из рук в руки не помогает.

Единственная реальная разница заключается в том, что FreeAndNil установит ссылку на Nil, даже если Free поднимает. Но ваши деструкторы никогда не должны подниматься, так что это не такая уж большая сделка на мой взгляд.

Существует общая ловушка с FreeAndNil. Поскольку он принимает нетипизированный параметр, вы можете передать ему что угодно. Например, вы можете передать интерфейс, запись и т. Д. Если вы сделаете эту ошибку, вы обычно получаете странные ошибки времени выполнения.

Я не собираюсь начинать, подходит ли или нет FreeAndNil. Эта тема была освещена в какой-то степени в другом месте.

+0

+1 за попытку избежать неизбежного общего обсуждения о 'Free' vs' FreeAndNil' :) – jpfollenius

+0

я не понял, что вы имели в виду под «Если вы хотите использовать ссылку, вы можете использовать FreeAndNil». Кроме того, если у вас есть хорошая ссылка, дайте ссылку, я хотел бы знать глубину – CyprUS

+1

FreeAndNil тривиально прост. В коде сказано все. Я хочу сказать, что если вы хотите освободить и обрезать объект, а затем указать ссылку, тогда позвоните FreeAndNil, а не сделайте это двумя разными шагами. Я не могу сказать это более ясно. –

Смежные вопросы