Форум: "Прочее";
Текущий архив: 2013.07.07;
Скачать: [xml.tar.bz2];
ВнизСоздание класса в TRY/FINALLY. Найти похожие ветки
← →
XXXXX (2013-02-24 23:45) [0]Какой вариант правильный?
1)
Obj:= TSuperClass.Create;
try
//
finally
Obj.Free;
end;
2)
try
Obj:= TSuperClass.Create;
//
finally
Obj.Free;
end;
Если в конструкторе происходит выделение памяти или какая-нибудь инициализация?
← →
Дмитрий С © (2013-02-24 23:54) [1]Первый конечно. Во-втором, если у тебя Obj не была проинициализирована и ты получил исключение в конструкторе, то в итоге ты получишь AV
← →
Юрий Зотов © (2013-02-25 00:02) [2]
> XXXXX (24.02.13 23:45)
> Какой вариант правильный?
Общее правило такое:
захватили какой-то ресурс (память, хэндл, что угодно другое)
try
что-то делаем с этим ресурсом, после чего он уже не нужен
finally
освобождаем ресурс
end
Суть в том, что если ресурс по каким-то причинам не был захвачен, то и освобождать его не нужно. Поэтому сначала - захват, потом - try.
← →
Дмитрий С © (2013-02-25 00:11) [3]Хотя если второй вариант переделать вот так:
Obj := nil;
try
Obj:= TSuperClass.Create;
//
finally
Obj.Free;
end;
то он тоже будет иметь право на жизнь. Так удобно делать, если требуется создать несколько объектов, а городить вложенные try..finally не хочется:
Obj1 := nil;
Obj2 := nil;
Obj3 := nil;
try
Obj1:= TSuperClass.Create;
Obj2:= TSuperClass.Create;
Obj3:= TSuperClass.Create;
//
finally
Obj1.Free;
Obj2.Free;
Obj3.Free;
end;
← →
Игорь Шевченко © (2013-02-25 00:43) [4]
> Если в конструкторе происходит выделение памяти или какая-
> нибудь инициализация?
То при ошибке в нем вызывается деструктор, в котором захваченная память волшебным образом освобождается и выполняется какая-нибудь финализация
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.07.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c