Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Вниз

классы...   Найти похожие ветки 

 
$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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
1-13202
Intell
2003-05-25 20:11
2003.06.05
У кого есть компонент Hint или Menu с настройкой прозрачности?


1-13258
OlegM
2003-05-23 10:10
2003.06.05
Вопров по командам Copy, Paste, Cut


8-13326
sergey bala
2003-02-20 09:59
2003.06.05
Произношение слов на русском якыке


3-13077
Pat
2003-05-18 09:24
2003.06.05
DisplayWidth для Lookup поля


1-13245
qwerty2
2003-05-23 14:15
2003.06.05
Еще раз про TThread





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский