Деструкторы глобальной переменной не называются, с чего начать? - PullRequest
2 голосов
/ 16 августа 2010

Я столкнулся с проблемой того, что мои приложения не вызывают деструкторы глобальных переменных. Похоже, это происходит только в том случае, если мое приложение успешно подключается к базе данных Oracle (используя OCI).

Я установил некоторые точки останова в CRT, и кажется, что DllMain (или __DllMainCRTStartup) не вызывается с DLL_PROCESS_DETACH, поэтому не вызывается atexit (), который объясняет, почему мои деструкторы не вызываются. Я понятия не имею, почему это происходит.

Я понимаю, что этой информации, вероятно, недостаточно, чтобы указать причину, но мой вопрос: что было бы хорошим началом для поиска причины этой проблемы?

Это список того, что я уже пробовал:

  • поиск в сети решений
  • подключил отладчик и включил собственные исключения, чтобы увидеть, что не было скрытого сбоя, иногда я получаю исключение в .Net framework, но приложение, похоже, продолжается.
  • попытаться воспроизвести в небольшом приложении, безуспешно

Ответы [ 4 ]

2 голосов
/ 16 августа 2010

Возможно, что кто-то звонит TerminateProcess, что в отличие от ExitProcess не уведомляет библиотеки DLL о завершении работы.

2 голосов
/ 16 августа 2010

Наиболее распространенная ситуация, с которой я сталкиваюсь, это сбой программы.В определенных обстоятельствах сбои могут происходить бесшумно с точки зрения конечного пользователя.Я бы прикрепил к программе отладчик, настроил его на все собственные исключения и запустил сценарий.

0 голосов
/ 16 августа 2010

Вызов API exit часто означает, что приложение выходит без вызова деструкторов. Я не уверен, что VC делает в этом случае.

Также старайтесь избегать использования глобальных объектов. Это потому, что вы мало контролируете, когда и в каком порядке называются конструкторы и деструкторы. Скорее конвертируйте объекты в указатели и инициализируйте и уничтожайте указатели, используя соответствующие DllMain хуки. Поскольку DllMain - это конструкция ОС, а не языковая конструкция, она должна оказаться более надежной в случае нормальных выходов.

0 голосов
/ 16 августа 2010

Это может быть полезно:

Что происходит с глобальными переменными, объявленными в DLL?

Ваши глобальные переменные объявлены внутри dll или в области памяти вашего приложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...