Если вы можете поместить эти 2 глобальные переменные в одну и ту же DLL, это не та история. Как сказал Джем в своем ответе, порядок отсоединения DLL не гарантируется системой. Поэтому у вас могут быть большие проблемы при наличии двух отдельных Dll. Я не гуру системы Windows, но, посмотрев в Google, я обнаружил блоггеров msdn, которые говорят, что у них возникла та же проблема, но нет хорошего решения для ее решения.
Если вы можете поместить их в одну и ту же DLL, по моему мнению, решение проще, в этом случае вам не нужно решать проблему «негарантированного порядка отключения DLL» (насколько я понимаю, неразрешимая) .
Но тогда вам все еще нужно решить новую проблему: порядок уничтожения глобальных переменных не гарантируется языком c ++. Но к этому можно обратиться:
вам нужно использовать какую-то контрольную маркировку. boost :: shared_ptr может сделать свое дело.
Объявите его глобальным и определите его так:
boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!
Затем вам нужно изменить реализацию вашего пользователя на store его собственный shared_ptr:
class User
{
...
boost::share_ptr a_resource_ptr;
...
};
До тех пор, пока все ваши экземпляры User не будут уничтожены, они будут «сохранять» экземпляр Resource и, таким образом, предотвращать его преждевременное удаление, даже если глобальный shared_ptr мог быть уничтожен.
Последний экземпляр пользователя, который будет уничтожен, (косвенно) удалит экземпляр ресурса.
Независимо от того, какой счетчик ссылок вы используете, ComPtr, ваш собственный, это должно сработать.