powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
7 сообщений из 7, страница 1 из 1
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706407
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день

Изучаю исходники TObject и TInterfacedObject, не могу понять, зачем в новых Delphi столько рутины, связанной со счётчиком ссылок
Зачем это всё?
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706409
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голландец,

потому что в новых делфи планировалось сделать автоуничтожение объектов (см nextgen compiler)
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706410
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГолландецИзучаю исходники TObject и TInterfacedObject, не могу понять, зачем в новых Delphi столько рутины, связанной со счётчиком ссылок
Зачем это всё?
Первый добавили чтобы не было повторного входа в деструктор .
Хотя можно было просто _addref вставить первым оператором.
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706424
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря не понял
Мне кажется всё это пошло от TInterfacedObject
В Nextgen судя по всему TObject становится аналогом интерфейса

Но для интерфейсов всегда был подсчёт ссылок
Может это имеет какое-то отношение к кольцевым ссылкам?
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706427
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГолландецНо для интерфейсов всегда был подсчёт ссылок
Может это имеет какое-то отношение к кольцевым ссылкам? Насчет кольцевых - вряд ли, их практически невозможно отследить.
Проблема в том, что одна сущность должна встраиваться в две разные концепции. Это порождает разные проблемы, в частности с реентерабельностью деструктора. Например, в таком коде
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure DoSomethingWithInterface(I: IUnknown);
begin
end;

destructor  TInterfacedObjectHeir.Destroy;
begin
  DoSomethingWithInterface();
end;


без дополнительной защиты возникнет рекурсия, переполнение стека или AV.
Но это легко преодолевается. Намного сложнее разрешить проблемы с интерфейсами из внешних библиотек.
Если оставить все на самотек, наверняка будет ситуация, когда библиотека будет выгружена, а ссылки останутся.
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706431
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Есть логика в твоих словах
Но там 2 флага, а не один
Кроме того, раньше же как-то жили без них

Вот бы толковую документацию почитать на этот счёт :)
...
Рейтинг: 0 / 0
TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
    #39706436
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голландец,
Со вторым флагом я не разбирался.
Рискну предположить, он связан с тем, что в стандартном дельфовом коде создаются скрытые интерфейсные ссылки, которые освобождаются по-разному в зависимости от типа кода.
Вероятно через ~20 лет пришло осознание, что это не есть всегда хорошо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TObject/TInterfacedObject: __MarkDestroying, __SetDisposed
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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