Глобальный указатель в DLL - PullRequest
0 голосов
/ 01 марта 2012

У меня есть проект C ++ DLL, который содержит исходный файл dllmain, заголовок, содержащий только объявления функций DLL, и файл cpp, который содержит полные определения функций, и глобальный указатель на экземпляр другого класса.Этот указатель инициализируется при вызове функции Init, а все остальные функции DLL используют указатель и возвращают ошибку, если она не была выделена.

Если не считать, что пользователь вызывает определенную функцию, когда он заканчивает работу с DLL (что звучит как ужасная идея), как я могу убедиться, что глобальный указатель в файле cpp освобожден?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Кроме того, чтобы полагаться на то, что пользователь вызывает определенную функцию, когда он заканчивает работу с DLL (что звучит как ужасная идея)

Учитывая, что у вас уже есть функция Init, имеет смысл иметь соответствующую Free функцию.

Как еще вы узнаете, когда пользователь завершит работу с библиотекой? Вы можете подождать, пока DLL не будет выгружена (см. DllMain), но к тому времени процесс, вероятно, все равно заканчивается.

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

0 голосов
/ 01 марта 2012

Когда DLL закрывается, будет вызываться DllMain с параметром DLL_PROCESS_DETACH;Вы можете поместить код, чтобы освободить свой глобальный там.

...