Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.014 c
14-13378
babun
2003-05-15 21:04
2003.06.05
Фильтр для поля типа date


3-13002
Lion
2003-05-18 23:35
2003.06.05
Select Into ?


3-13036
LittleGirly
2003-05-15 16:03
2003.06.05
Помогите девушке с QuickReport-ом


3-13022
Dimaz-z
2003-05-16 12:02
2003.06.05
Как выстроить записи в базе данных по алфавиту? Помогите!!!


14-13385
Ghost
2003-05-16 11:06
2003.06.05
Передать скриншот экрана по сети не преобразовывая его в файл