Неявный вызов деструктора класса Dictionary

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте!
С6.1 RC2
Начинаю юзать C6. Заметил следующую ситуацию:
В GlobalData описывается класс

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

Dictionary           CLASS,THREAD
Construct              PROCEDURE
Destruct                PROCEDURE
                            END

Dictionary.Construct PROCEDURE
  CODE
  IF THREAD()<>1
     DctInit()
  END

Dictionary.Destruct PROCEDURE
  CODE
  DctKill()

, где  DctInit     PROCEDURE                                      !
Initializes the dictionary definition module
          DctKill     PROCEDURE                                      ! Kills
the dictionary definition module
В теле программы после инициализации классов GlobalErrors и INIMgr вызывается и процедура инициализации DctInit. Но если до вызова этой процедуры завершить программу через RETURN (такой код, например, используется в шаблоне "One application Instance" из состава ABCFree при проверке повторного запуска приложения) , то приложение вываливается в ошибку "Инструкция по адресу... Память не может быть считана". Получается, что неявно срабатывает деструктор класса Dictionary, а конструктор перед этим не сработал. И только, если перед RETURN явно указать DctInit, то все в порядке.
Подскажите, пожалуйста, как все-таки в этой ситуации работает конструктор и деструктор класса? Сие есть баг, или это ошибка в шаблоне "One application Instance"?

С уважением, Семен

Написал: ClaList(2)
Гость

Сообщение Гость »

Конечно же, я неправильно написал. Это не конструктор не сработал, а не вызвалась процедура инициализации DctInit, поскольку TREAD() = 1.
Но для чего нужна комбинация IF THREAD()<>1 THEN DctInit(), когда далее все равно идет явный вызов DctInit().

В случае мульти-DLL-приложения получается все O'K, поскольку шаблон проверки повторного запуска приложения подключается в главном APP (*.exe), а все файловые описания в нем как External. Поэтому приложение при повторном запуске завершится до инициализации DLL, в которой и должен был бы сработать DctInit().

С уважением, Семен
Написал: ClaList(2)
Ответить