Страница 2 из 2

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 13:44
Губин Игорь
Дед Пахом писал(а): Тут конструктор вызывается перед объявлением
Согласен это мысль!
Хотя "моём" случае нет переопределения функций. Если только велосипедисты не наступили на такие грабли сами где-то в описаниях класса. Это мысль. Но тогда надо разбираться со всем классом, а это ну его нафиг.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 16:24
Yufil
Насколько я понимаю, при использовании New деструктор вообще не вызывается. Потому и не кусают...

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 16:34
Губин Игорь
Yufil писал(а): деструктор вообще не вызывается
?????? Dispose ??????????? :idied:
The Destruct method is an automatic destructor that is called when the object is removed from memory. This ensures that all data allocated by the object is removed from memory.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 18:44
Yufil
Если объект создан через New, Dispose не вызывается. А вот если создан как локальный объект класса процедуры, тогда да...

Код: Выделить всё

S   &MyObject 
S1   MyObject 

Code 
!  Сейчас сработал конструктор S1 
S  &= New(MyObject)  ! Присвоили ссылку 
....
Return 
!  Сработал деструктор для S1 
! А деструктор для S не сработает... 
Может быть, имеет смысл создать конструкторы - деструкторы с глобальной очередью - пулом свободных объектов
Деструктор не уничтожает объект, а возвращает его в пул
Конструктор выбирает свободный объект из пула, если таковой есть. Или создаёт, если нет...
Но это так, пожелания...

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 19:13
Дед Пахом
Yufil писал(а): Если объект создан через New, Dispose не вызывается
DISPOSE или деструктор? DISPOSE надо вызвать самому, это автоматически вызовет деструктор.

Код: Выделить всё

  DISPOSE(s)  !- неявный вызов деструктора

Продолжаем копить глюки SyStemStrngClass

Добавлено: 08 Март 2017, 19:11
Губин Игорь
Yufil писал(а):
Может быть, имеет смысл создать конструкторы - деструкторы с глобальной очередью - пулом свободных объектов
Деструктор не уничтожает объект, а возвращает его в пул
Можно, но это нарушает "бритву Оккама". Да и излишние расходы на поиск свободного объекта в пуле, если работа не организована по принципу стека.
У меня есть что-то подобное, но там меньше десятка однотипных объектов, да и занимаются/освобождаются они при входе/выходе процедуры. Сделано для экономии ресурсов при первичной инициализации, которая выполняется при запуске потока (довольно муторный набор операций).

Продолжаем копить глюки SyStemStrngClass

Добавлено: 08 Март 2017, 19:24
Yufil
Пул - просто глобальная очередь ссылок, это не проблема.

У меня программа падала на вызове деструктора класса, один из вариантов исправления был - совсем убрать деструкторы,
завести очередь свободных объектов, как описано выше. К счастью, проблема после долгих плясок с бубном рассосалась...

Продолжаем копить глюки SyStemStrngClass

Добавлено: 08 Март 2017, 23:34
Губин Игорь
Yufil писал(а): Пул - просто глобальная очередь ссылок, это не проблема.
Я понял. И ответ как раз на тему, что, ро мне, не всегда это оправданно. Только если ссылок много.
Yufil писал(а): У меня программа падала на вызове деструктора класса
У меня аналогичная ситуация. Как выяснилось, SystemStringClass не любит ни конструкторов, ни деструкторов, если они автоматически вызываются в момент объявления переменной или закрытия программы, за исключением случаев, когда это выполняется при инициализации/закрытии потока.