powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор?
71 сообщений из 71, показаны все 3 страниц
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795706
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На форуме встретил эту фразу:
“Если в конструкторе произойдет исключение, то неявно вызовется деструктор”

Я не уловил, как это работает на практике. Вот пример:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
constructor TMyObject.Create;
begin
  // ... здесь Exception. Выход и вызыв деструктора

  FSubObject_1 := TObject.Create;
  FSubObject_2 := TObject.Create;
  FSubObject_3 := TObject.Create;
end;

destructor TMyObject.Destroy; 
begin
  // ... а зачем вызвать деструктор, если конструктор не отработал?

  FSubObject_1.Destroy;   // ... еще Exception ?
  FSubObject_2.Destroy;
  FSubObject_3.Destroy;
end;


Собственно вопрос в примере.
Поделитесь вашими мыслями.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795710
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

1. Для недоконструированного объекта будет вызван деструктор (так проще)
2. Исключения в деструкторах - харам
3. Во избежание исключений при попытке уничтожить несконструированный объект следует вызывать метод Free, вместо прямого вызова деструктора.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795715
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, спасибо за ответ.
Пожалуйста, поясните про п.2 "Исключения в деструкторах - харам"
Что это значит?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795722
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stЧто это значит?
Это значит запрещены. То есть, код в деструкторе не должен приводить к необработанным исключительным ситуациям.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795730
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора.
Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free.

Вот код из VCL , где никакие "костыли" не помогут:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
constructor TCheckListBox.Create(AOwner: TComponent);
begin
  // ... предположим здесь Исключение и вызов деструктора.
  
  FWrapperList := TList.Create;
end;

destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  //  ... если было Исключение, то FWrapperList не инициализирован

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795736
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programerвы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее).
Я предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795741
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyЯ предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
уважаемый, а почему авторы VCL (см. их код выше) не придерживаются этих советов?
Таки нехорошо... Ась?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795743
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и вызывать Destroy вообще говоря неверно
нужно Free
а лучше FreeAndNil
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795744
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programerа почему авторы VCL (см. их код выше) не придерживаются этих советов?
Это вопрос к авторам VCL. Кстати говоря, ни VCL, ни даже RTL, давно уже не являются примером для подражания.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795745
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyкод в деструкторе не должен приводить к необработанным исключительным ситуациям.
Спасибо за ответы по существу.
А если случается исключение в деструкторе, то что тогда происходит?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795750
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?харам
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795751
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?
Утечки ресурсов, памяти.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795754
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyни VCL, ни даже RTL, давно уже не являются примером для подражания.
По правде говоря, я в соседней теме поднимал вопрос, про что в Delphi является "примером для подражания" :)
Если VCL и RTL не эталоны подражания, то чтож тогда...
:-(
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795763
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
destructor TCheckListBox.Destroy;
var
I: Integer;
begin
// ... если было Исключение, то FWrapperList не инициализирован

for I := 0 to FWrapperList.Count - 1 do
TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;

Вероятность исключения при TList.Create равна (или очень близка) нулю (не смотрел, что ещё там есть ниже). Если такое произойдёт, значит в программе есть утечка и работать она всё равно уже не будет.

Но лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795774
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stЕсли VCL и RTL не эталоны подражания, то чтож тогда...
Стоит, пожалуй, уточнить. В общем и целом, их код можно рассматривать, как некоторую базовую основу для получения знаний. Но нужно понимать, что код пишется людьми, а людям свойственно ошибаться (приведённый выше пример из VCL - это банальная ошибка, которая не стоит потраченных на её обсуждение усилий). Откровено плохой код, такой, чтоб прям ужас-ужас, там попадается нечасто. Поэтому, рассматривать VCL/RTL, как базу знаний можно, но слепо и бездумно следовать всему, что там написано, всё же, не стоит.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795776
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795778
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795789
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BDmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy

Ты вроде не со студентами общаешься, если что...
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795799
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerKazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора.
Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free.

Вот код из VCL , где никакие "костыли" не помогут:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
constructor TCheckListBox.Create(AOwner: TComponent);
begin
  // ... предположим здесь Исключение и вызов деструктора.
  
  FWrapperList := TList.Create;
end;

destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  //  ... если было Исключение, то FWrapperList не инициализирован

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[src DELPHI]
destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  try
  //  ... если было Исключение, то FWrapperList не инициализирован
  except
  end;

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;


Используйте блоки try except end; или try finally end;
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795805
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндивсегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
Бесполезная проверка. Выбросите if — ничего не изменится.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795809
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть офдоки.
http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi)
там на понятном языке написано и про NIL и про Destroy и про Free
зачем еще тащить этот вопрос??
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795945
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь..
При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795955
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой?
EInvalidArgumentException, например.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795992
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Это в методах должно быть. В конструкторе такое нельзя допускать и решается ассертами. Т.е. на этапе разработки такие проблемы исключаются.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795997
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

А в параметризированных конструкторах?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795999
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь..
При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения.
авторAnything that can go wrong will go wrong
когда прога идёт на миллионы запусков, случаются даже самые странные вещи, и очень часто неправильно написанный конструктор\деструктор маскирует проблему.

причём, в 10-ке выглядит это очень странно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  procedure CreateComponent;
  var
    ComponentClass: TComponentClass;
  begin
    try
      ComponentClass := FindComponentClass(CompClass);
      Result := nil;
      if Assigned(FOnCreateComponent) then
        FOnCreateComponent(Self, ComponentClass, Result);
      if Result = nil then
      begin
        Result := TComponent(ComponentClass.NewInstance);
        if ffInline in Flags then
        begin
          Include(Result.FComponentState, csLoading);
          Include(Result.FComponentState, csInline);
        end;
        try
          Result.Create(Owner);
        except
          Result := nil;
          raise;
        end;
      end;
      Include(Result.FComponentState, csLoading);
    except
      if not Recover(Result) then raise;
    end;
  end;


и по идее так быть не должно, вызов конструктора как метод не должен удалять объект - это очень странно и явная бага

исходник на паскале не соответствует ассемблерной вставке

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
function _ClassCreate(InstanceOrVMT: Pointer; Alloc: ShortInt): Pointer;
{$IF defined(PUREPASCAL)}
begin
  if Alloc >= 0 then
    InstanceOrVMT := Pointer(TClass(InstanceOrVMT).NewInstance);
  Result := TObject(InstanceOrVMT);
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
asm
        { ->    EAX = pointer to VMT      }
        { <-    EAX = pointer to instance }
        PUSH    EDX
        PUSH    ECX
        PUSH    EBX
        TEST    DL,DL
        JL      @@noAlloc
        CALL    DWORD PTR [EAX] + VMTOFFSET TObject.NewInstance
@@noAlloc:
{$IFDEF STACK_BASED_EXCEPTIONS}
        XOR     EDX,EDX
        LEA     ECX,[ESP+16]
        MOV     EBX,FS:[EDX]
        MOV     [ECX].TExcFrame.next,EBX
        MOV     [ECX].TExcFrame.hEBP,EBP
        MOV     [ECX].TExcFrame.desc,offset @desc
        MOV     [ECX].TexcFrame.ConstructedObject,EAX   { trick: remember copy to instance }
        MOV     FS:[EDX],ECX
{$ENDIF STACK_BASED_EXCEPTIONS}
        POP     EBX
        POP     ECX
        POP     EDX
        RET

{$IFDEF STACK_BASED_EXCEPTIONS}
@desc:
        JMP     _HandleAnyException

  {       destroy the object                                                      }

        MOV     EAX,[ESP+8+9*4]
        MOV     EAX,[EAX].TExcFrame.ConstructedObject
        TEST    EAX,EAX
        JE      @@skip
        MOV     ECX,[EAX]
        MOV     DL,$81
        PUSH    EAX
        CALL    DWORD PTR [ECX] + VMTOFFSET TObject.Destroy
        POP     EAX
        CALL    _ClassDestroy
@@skip:
  {       reraise the exception   }
        CALL    _RaiseAgain
{$ENDIF STACK_BASED_EXCEPTIONS}
end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}

...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796027
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вызов конструктора как метод не должен удалять объект Подумай! Как удалить то, чего нет!
Вот ты из лего строишь дом. Вдруг пёс налетел и сборку развалил и погрыз. Лего больше нет. И дом не вышел. Осталось осколки веником подмести и отнести на помойку.
С песчаными замками тоже. Строишь-строишь, а тут цунами.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796028
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinну и вызывать Destroy вообще говоря неверно
нужно Free
а лучше FreeAndNilИногда возможна неприятная ситуация.
FreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали). И если где-то в недрах деструктора использовалась эта ссылка (как глобальная переменная, к примеру), то будет плохо.
Понятно, что к такому может привести только говнокод, но такое случается.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796029
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-Cite,

А в параметризированных конструкторах?

Assert для этого. Проектировать классы надо так, чтобы конструкторы не падали по ожидаемой ошибке во время выполнения.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796032
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteAssert для этого.
Это тоже будет исключением.
X-CiteПроектировать классы надо так, чтобы конструкторы не падали по ожидаемой ошибке во время выполнения.
Глупости. Как ты сможешь гарантировать, что, например, конструктор TFileStream не грохнется от тысячи и одной причины?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796036
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь..

Исключения в конструкторах - нормальное явление, хоть и не желательное.
Попробуй TFileStream.Create
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796037
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Movie #30 - Exceptions in Constructors and Desctructors

YouTube Video
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796055
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TFileStream как раз таки генерирует исключение связанное с внешним ресурсом, в моей нотации это External
Мы же говорим о замкнутой системе классов, проектируемой в рамках библиотеки/фреймворка/прилоежния.
При проектировании таких классов, можно легко избежать возбуждения исключений не связанных с памятью, и внешними ресурсами..
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796057
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Этак всё к external отнести можно, параметры же извне поступают...
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796085
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014
Код: pascal
1.
2.
3.
4.
destructor TCheckListBox.Destroy;
begin
  ...
end;


Используйте блоки try except end; или try finally end;
Уважаемый, это был код из VCL . И вы решили авторам VCL указаывать как надо деструкторы писать?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796090
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке ...
Уважаемый, вы задаете странные вопросы.
В конструкторах часто происходит много работы по инициализации объектов, выделение рерурсов/памяти, цепочка вызовов конструкторов агрегированных объектов, вызовы родительских конструкторов ... и т.д. и т.п.

А вы привыкли, работать с "пустыми" конструкорами?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796127
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programer,

Никто не спорит что там это все происходит..

авторТ.е. на этапе разработки такие проблемы исключаются.

Когда что-то уходит в релиз, там уже нечему вызывать исключения.. Теоретически оно может, а практически никогда. А если там развалилось что-то связанное с памятью это уже и так фатал.

А если класс нарушает принцип единственной ответственности, ну так это уже проблемы другого уровня.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796155
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteА если класс нарушает принцип единственной ответственности, ну так это уже проблемы другого уровня.

В принципе - да.
И если я тебя правильно понял, то raise Exception.Create в конструкторах быть не должно(т.е. предвиденное исключение).
TFileStream - это исключение, а не правило.
High.ProgramerА вы привыкли, работать с "пустыми" конструкорами?

Я да. Так или иначе 99% конструкторов это:
1. Наследник от TForm
2. Наследник от TControl
3. Наследник от TObject.

А если в проекте, есть какой-то другой базовый класс, от которого надо наследоваться и в нём вылезает исключение - то это проблема автора базового класса.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796157
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorkealon(Ruslan)вызов конструктора как метод не должен удалять объект Подумай! Как удалить то, чего нет!
Вот ты из лего строишь дом. Вдруг пёс налетел и сборку развалил и погрыз. Лего больше нет. И дом не вышел. Осталось осколки веником подмести и отнести на помойку.
С песчаными замками тоже. Строишь-строишь, а тут цунами.если следовать такой аналогии
вот ты дом сразу без фундамента строишь? нет, сначала нужно выделить память под объект, а потом уже вызывать его постройку

Не получилось у бригады дом построить и они тебе всё снесли вместе с фундаментом, круто?
Вот и тут так же, т.е. если я напрямую вызываю метод объекта я не ожидаю, что он вызовет удаление памяти под него. Кто выделял память тот и должен удалять,
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796310
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valery_BHigh.ProgramerА вы привыкли, работать с "пустыми" конструкорами?

Я да. Так или иначе 99% конструкторов это:
1. Наследник от TForm

Уважаемый, Вы напрасно испытываете мое терпение, т.к. у TForm самый "проблемный" конструктуор из всей VCL. А вы думали он "пустой" ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
constructor TCustomForm.Create(AOwner: TComponent);
begin
  GlobalNameSpace.BeginWrite;
  try
    CreateNew(AOwner);
    if (ClassType <> TForm) and not (csDesigning in ComponentState) then
    begin
      Include(FFormState, fsCreating);
      try
        if not InitInheritedComponent(Self, TForm) then
          raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
      finally
        Exclude(FFormState, fsCreating);
      end;
      if OldCreateOrder then DoCreate;
    end;
  finally
    GlobalNameSpace.EndWrite;
  end;
end;


... а внутрь CreateNew(AOwner) даже не заглядывайте, там Вас ждет ужасное разочарование в виде нескончаемых выделений ресурсов операционной системы (в вашем случае MS Windows)

Вы все еще мечтаете о "пустых" конструкторах?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796332
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали). И если где-то в недрах деструктора использовалась эта ссылка (как глобальная переменная, к примеру), то будет плохо.
Понятно, что к такому может привести только говнокод, но такое случается.
Если кто-то в деструкторе объекта использует внешнюю ссылку на экземпляр этого же объекта, то я даже не знаю как такого человека вежливо назвать...
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796335
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали).И, кстати, сделали это чтобы после вызова FreeAndNil можно было быть на 100% уверенным, что ссылка будет обнулена, даже если в деструкторе объекта возникнет исключение.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796461
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerВ конструкторах часто происходит много работы по инициализации объектов, выделение рерурсов/памяти, цепочка вызовов конструкторов агрегированных объектов, вызовы родительских конструкторов ... и т.д. и т.п.а в деструкторах соответственно часто все должно разматываться в обратную сторону и сюрпризом для кого-то могут оказаться деструкторы таки вызывающие исключения и порой именно в продуктиве
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796871
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpYuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали).И, кстати, сделали это чтобы после вызова FreeAndNil можно было быть на 100% уверенным, что ссылка будет обнулена, даже если в деструкторе объекта возникнет исключение.А, теперь понятно. Но тогда логичнее было назвать функцию NilAndFree. Я как-то из-за такой проблемы долго бился.

P.S. Я лишь привел пример случая, когда o.Free; o := nil; гораздо надежнее, чем FreeAndNil. Особенно, когда работаешь с громадной базой кода, зачастую - чужого.
Та же дельфя побуждает глобальные переменные типа Form1 юзать. Вот и юзают, даже внутри методов формы.
А бывает, и сам не заметишь, как что-то подобное сам замутишь. В моем случае использовалась ссылка (на себя) из объекта-owner'а, через три прослойки заюзанная в деструкторе.
Хорошо, конечно, что я в итоге упростил и улучшил этот говнокод. Но не напиши я там FreeAndNil тогда - не потратил бы день и по сейчас не знал бы об этой проблеме.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796876
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, парни, надо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний,
может произойти все, что угодно. И, исходя именно из этой простой мысли, надо отдавать себе отчет, как же имено
предохраняться деструкторах.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39796879
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FОднако, парни, надо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний,
может произойти все, что угодно. И, исходя именно из этой простой мысли, надо отдавать себе отчет, как же имено
предохраняться деструкторах.Понятно, что надо. И это прямым текстом написано в хелпе (как-то читал).
Только ничего сложного в этом нет. Есть Free и есть if Assigned для более сложных редких случаев.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797001
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad Fнадо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний,
может произойти все, что угоднои в деструкторах, причем чужих
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797002
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

авторХорошо, конечно, что я в итоге упростил и улучшил этот говнокод. Но не напиши я там FreeAndNil тогда - не потратил бы день и по сейчас не знал бы об этой проблеме.
Не понял, при чем здесь FreeAndNil? Ну юзал бы ты Free вместо FreeAndNil стало бы легче? Всё равно бы полез к разрушенной ссылке. Только в случае FreeAndNil тебе сразу по пальцам дали. А в случае Free имел бы вяло-текущий и проявляющийся в одном случае из десяти или ста баг. Который бы искал не день, а неделю.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797004
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockэто прямым текстом написано в хелпесобсно для использования в деструкторах и был изобретен free, для ряда прочих случаев можно сразу дестроить
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797057
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вы фантазёры

сначала был изобретён метод free, как раз для деструкторов, что бы если объект не инициализировался в конструкторе при исключении можно было писать код без проверки существования объекта

потом поняли, что ссылка на убитый объект - лажа, и писать отдельно код для её обнуления не камильфо, и придумали FreeAndNil
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797193
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonНе понял, при чем здесь FreeAndNil? Ну юзал бы ты Free вместо FreeAndNil стало бы легче? Всё равно бы полез к разрушенной ссылке.
Да, стало бы легче, вернее - совсем хорошо.
Никакого обращения "к разрушенной ссылке" не было бы.
А так - FreeAndNil вначале присвоил ссылке nil, а затем вызвал деструктор, внутри которого происходило обращение к этому объекту по этой ссылке (которая уже nil, а была равна Self).
Теперь понятнее стало? :)
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797427
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797428
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797490
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть того, что деструктор вызовется неявно при ошибке в конструкторе, это очевидно...

Предположим что неявного вызова деструктора нет.
Рассмотрим несколько кейсов.
Код: pascal
1.
2.
var A := TObject.Create();  // 1
A.Free();  // 2


Если в строке 1 будет Exception, то строка 2 никогда не выполнится и ресурсы выделенные в конструкторе до ошибки не освободятся


Код: pascal
1.
2.
3.
4.
5.
  try
    var A := TObject.Create();
  finally
    A.Free();
  end;


Если в конструкторе будет исключение, то присвоение в переменную А не будет выполнено. Следовательно строка в finally не валидная, т.к. А смотрит в никуда... Следовательно ресурсы выделенные в конструкторе до ошибки не освободятся

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

Поэтому деструкторы надо писать исходя из того, что в конструкторе на любом этапе может вылететь исключение
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797539
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockmakhaonYuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да


Ну кто тебе тогда виноват?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797653
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Citeдеструктор вызовется неявно при ошибке в конструкторе, это очевидно...
Код: pascal
1.
2.
3.
4.
5.
  try
    var A := TObject.Create();
  finally
    A.Free();
  end;



Это наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797665
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerЭто наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?Это очевидо подтверждает утверждение, что сдуру можно и член сломать. Вне зависимости от языка.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797670
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerКогда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?
Неверно.. В finally в A будет лежать мусор, а не экземпляр класса.. Присвоение то не выполнится
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798795
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798920
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarЕМНИП там нормальный nil будет.Там будет мусор из стека. В зависимости от расположения звезд, где-то в 60-80% случаев там окажется nil
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798970
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался.
Есть два очевидных варианта
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  var A := nil;
  try
    A := TObject.Create();
    ...
  finally
    A.Free();
  end;


и
Код: pascal
1.
2.
3.
4.
5.
6.
  var A := TObject.Create();
  try
    ...
  finally
    A.Free();
  end;


или я что-то не понимаю?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798990
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного"
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798993
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRockпропущено...
Ну да


Ну кто тебе тогда виноват?
Это не важно, кто виноват. Это был просто пример, когда FreeAndNil опаснее o.Free; o := nil.

И, да, естественно, обращение к конкретному экземпляру было не между begin end деструктора, а глубоко в недрах, т.ч. не всё так очевидно было и легко, как кажется.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799000
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799001
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему.Обозначил, да, и это хорошо, я ж не спорю.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799003
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799004
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stНа форуме встретил эту фразу:
“Если в конструкторе произойдет исключение, то неявно вызовется деструктор”

Ссыль на тему
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799018
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

arc оказался настолько хорош, что от него решили в линуксе отказаться :)
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799031
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbkealon(Ruslan)roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799212
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)roschinspbпропущено...
спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали
А надо было отлить в граните и поставить в музей? :o) Любое развитие — это отклонение от стандарта.
Вообще говоря, во времена борланд развитие было довольно логичным и адекватным, потом начался разброд и шатание.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799590
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

т.е. если следовать этой логике, то стандарты плюсов писали старые п***, в качестве мемуаров?
...
Рейтинг: 0 / 0
71 сообщений из 71, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]