Текущий архив: 2003.06.05;
Скачать: CL | DM;
Вниз
классы... Найти похожие ветки
← →
$hade (2003-05-22 16:13) [0]вот мучают меня сомнения....
создаю свой класс, в конструкторе нужно инициализировать некоторые переменные,в частности создать поток и записать некоторые данные...
Так собсно вопрос: Если по каким то причинам не удалось записать данные в поток (соответственно и не должен создаться экземпляр класса) нужно ли уничтожать этот поток (в try...except) или он уничтожится автоматом при выходе с exception"ом из конструктора?
← →
KSergey (2003-05-22 16:15) [1]Нужно
Никто, кроме программиста, создающего объекты, е в курсе какие именно объекты он создал. Ну т.е. оно не всегда совсем так, иногда VCL предоставляет определенный сервис, но только при условии оповещния ее об этом.
← →
$hade (2003-05-22 16:20) [2]значит не зря меня сомнения мучали...:-) Thnks.
← →
rounin (2003-05-22 16:27) [3]Ну вообще-то, когда ты вызываешь эксепшн из конструктора
твоего класса, то автоматически вызывается его деструктор.
И если в деструкторе предусмотрено уничтожение потока,
то он уничтожится.
← →
VMcL (2003-05-22 16:33) [4]
constructor TMyClass.Create(...)
begin
...
if Глюк then
raise Exception.Create("...");
end;
← →
$hade (2003-05-22 16:33) [5]таак...ща голосовать будем...:-)
как раз по поводу этого и были сомнения....
← →
$hade (2003-05-22 16:35) [6]2VMcL ©
и что??
у меня и без моего raise эксцепшен может вылететь...
← →
Calm (2003-05-22 16:37) [7]
> constructor TMyClass.Create(...)
> begin
> ...
> if Глюк then
> raise Exception.Create("...");
> end;
Объект однозначно будет уничтожен.
← →
VMcL (2003-05-22 16:40) [8]>$hade © (22.05.03 16:35)
Если в конструкторе класса возникает исключение, объект уничтожается автоматически (код генерируется компилятором).
← →
Юрий Зотов (2003-05-22 16:43) [9]> $hade
Не надо голосовать. Просто внимательно прочитайте:
rounin (22.05.03 16:27)
Если остались сомнения, поставьте в ДЕСТРУКТОРЕ BreakPoint, а в КОНТРУКТОРЕ возбудите любое исключение. Все увидите сами.
← →
VMcL (2003-05-22 16:46) [10]Кстати см. >rounin (22.05.03 16:27)
← →
$hade (2003-05-22 16:46) [11]>VMcL © (22.05.03 16:40)
>$hade © (22.05.03 16:35)
Если в конструкторе класса возникает исключение, объект уничтожается автоматически (код генерируется компилятором).
Что и требовалось...
2Юрий Зотов ©
>Если остались сомнения...
После вас - никаких :-)
← →
Юрий Зотов (2003-05-22 16:59) [12]> $hade
Только обратите внимание вот на что:
"И если в деструкторе предусмотрено уничтожение потока,
то он уничтожится."
Соответственно, если Ваш поток - локальный в конструкторе, то там его и надо уничтожать с try-finally.
← →
$hade (2003-05-22 17:06) [13]2Юрий Зотов ©
:-) ну я не до такой степени не знаю Delphi... :-)
Спасибо.
← →
KSergey (2003-05-23 09:49) [14]> rounin (22.05.03 16:27)
> Юрий Зотов © (22.05.03 16:43)
Так, а вот это интересно...
Предположим есть модельный код:
type
TLala = class
private
F: TBebe;
public
constructor Create;
destructor Destroy;
end;
implementation
constructor TLala.Create;
begin
raise Exception.Create("!!!");
F := TBebe.Create;
end;
destructor TLala.Destroy;
begin
F.Free;
end;
Оставим в стороне возможные ошибки, идея, думаю, понятна. raise написал условно, просто пердполагаем, что где-то в коде выше создания объекта TBebe произошло исключение. Согласно утверждениям выше деструктор вызовется, но ведь объект-то еще не создан! Соотв. Free вызовет опять же исключение...
Или надо писать
destructor TLala.Destroy;
begin
if Assigned (F) then F.Free;
end;
Если так, то кто тогда должен прсваивать F значение nil? Или они присвоится автоматически? Или и конструктор надо писать как
constructor TLala.Create;
begin
F := nil;
raise Exception.Create("!!!");
F := TBebe.Create;
end;
← →
Digitman (2003-05-23 09:59) [15]>KSergey
достаточно взглянуть вот сюда
class function TObject.InitInstance(Instance: Pointer): TObject;
asm
PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX,EAX
MOV EDI,EDX
STOSD
MOV ECX,[EBX].vmtInstanceSize
XOR EAX,EAX
PUSH ECX
SHR ECX,2
DEC ECX
REP STOSD
POP ECX
AND ECX,3
REP STOSB
MOV EAX,EDX
MOV EDX,ESP
@@0: MOV ECX,[EBX].vmtIntfTable
TEST ECX,ECX
JE @@1
PUSH ECX
@@1: MOV EBX,[EBX].vmtParent
TEST EBX,EBX
JE @@2
MOV EBX,[EBX]
JMP @@0
@@2: CMP ESP,EDX
JE @@5
@@3: POP EBX
MOV ECX,[EBX].TInterfaceTable.EntryCount
ADD EBX,4
@@4: MOV ESI,[EBX].TInterfaceEntry.VTable
TEST ESI,ESI
JE @@4a
MOV EDI,[EBX].TInterfaceEntry.IOffset
MOV [EAX+EDI],ESI
@@4a: ADD EBX,TYPE TInterfaceEntry
DEC ECX
JNE @@4
CMP ESP,EDX
JNE @@3
@@5: POP EDI
POP ESI
POP EBX
end;
чтобы убедиться в том, что F изначально = nil
← →
Юрий Зотов (2003-05-23 10:03) [16]> Соотв. Free вызовет опять же исключение...
Не вызовет. Свежесозданный объект чистится нулями, поэтому F будет равно nil, а Free проверяет Self. Так что все будет тип-топ.
Не правда ли, чем глубже узнаешь Delphi, тем больше восхищаешься, насколько же красиво она сделана?
← →
Anatoly Podgoretsky (2003-05-23 10:05) [17]KSergey © (23.05.03 09:49)
Free безопасно работает на не созданных объектах, так что код абсолютно правильный и не вызовет никаких проблем в работе Destroy
← →
KSergey (2003-05-23 10:06) [18]> Digitman © (23.05.03 09:59)
Понял, спасибо.
Ну и чтобы добить вопрос окончательно - а с глобальными переменными как? Прошу прощения, что ленюсь поискать самостоятельно
← →
KSergey (2003-05-23 10:11) [19]> Юрий Зотов © (23.05.03 10:03)
> Не правда ли, чем глубже узнаешь Delphi, тем больше восхищаешься, насколько же красиво она сделана?
Ну дык, писали-то не такие, как я ;)
Интересно, MicroSoft утверждает, что C# разрабатывал вася, работавший в Borland. Там так же все красиво и продуманно, или это опять очередной несуразный, непоследовательный и нелогичный VB?
> Anatoly Podgoretsky © (23.05.03 10:05)
> Free безопасно работает на не созданных объектах, так что
> код абсолютно правильный и не вызовет никаких проблем в
> работе Destroy
Данный код как я понял да, но вот всегда ли Free безопасно работает на несозданных объектах? А если F<>nil, но объект не создан? (ну я взял, и 125 этой переменной присвоил? Имею же в конце концов право! ;)
← →
Anatoly Podgoretsky (2003-05-23 10:22) [20]На изолированных объектах не безопасно, но и не надо допускать такой ситуации.
← →
Ihor Osov'yak (2003-05-23 11:21) [21]> разрабатывал вася,
Не вася, а Андерс Хеджлсберг..
http://www.russianenterprisesolutions.com/techno/01/61.html
>Там так же все красиво и продуманно,
С первого взгляда - да. Но поживем, увидим..
Страницы: 1 вся ветка
Текущий архив: 2003.06.05;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c