Как я могу проверить, что каждый экземпляр данного класса разрушается при завершении работы приложения?

Я написал упрощенно DBResourceMonitor класс, который используется набором классов базы данных. Когда создается экземпляр одного из моих классов базы данных, он регистрирует себя, а при уничтожении он отменяет регистрацию с помощью одноэлементного экземпляра DBResourceMonitor, Когда приложение завершается, этот глобальный экземпляр DBResrouceMonitor уничтожается, что проверяет, чтобы убедиться, что не осталось ни одного зарегистрированного экземпляра ни одного из классов, которые он отслеживает (т. е. для каждого регистра была вызвана незарегистрированная запись), и выдает выходные данные TRACE и ASSERT, если было несоответствие.

Это все хорошо, пока я не поместил пару таких объектов базы данных в качестве членов моего глобального объекта приложения. Следовательно, как глобальный объект приложения, так и DBResourceMonitor являются глобальными синглетонами, и приложение создается первым, следовательно, уничтожается последним и, следовательно, когда DBResrouceMonitor уничтожен, члены объекта приложения еще не были зарегистрированы, поэтому он выдает ошибку, указывающую на то, что произошли несоответствующие вызовы регистрации / отмены регистрации.

Насколько я знаю, нет никакого способа гарантировать, что DBResrouceMonitor создается перед объектом приложения (и, следовательно, уничтожается впоследствии).

Это правильно? Есть ли умный способ обойти это или способ переосмыслить вышесказанное, чтобы я все еще мог отслеживать, все ли было решено до того, как завершится последний поток?

0

Решение

Вместо того, чтобы объекты регистрировали / отменяли регистрацию с помощью синглтона, вам нужно хранить ссылки на эти объекты в свойстве коллекции Singleton. Так что вместо того, чтобы делать:

var x = new MyDBObject();

вы бы использовали фабричный шаблон как:

var x = DBResourceMonitor.GetDBObject();

и где-то в DBResourceMonitor вы можете управлять коллекцией MyDBObjects

MyDBObject GetDBObject()
{
//construct and save a MyDBObject or retrieve one from a list.

}
2

Другие решения

Вы можете позволить объекту базы данных быть таким же, как монитор ресурсов, имея базовый класс, который «регистрирует» объект базы данных в его конструкторе и «отменяет регистрацию» его в (виртуальном) деструкторе. Таким образом, вы можете просто создать объект и не беспокоиться о синглетонах или дополнительных классах монитора. Разумеется, коллекция объектов будет частным статическим членом в этом базовом классе, возможно, защищенным в случае использования многопоточности.

Я бы также использовал std::unique_ptr вместо сырых указателей, или, возможно, std::shared_ptr.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector