我如何验证应用程序终止是否破坏了给定类的每个实例?

时间:2012-11-20 18:53:43

标签: c++ winapi mfc visual-studio-2012 global-variables

我写了一个简单的DBResourceMonitor类,由一组数据库类使用。当我创建一个我的数据库类的实例时,它会自行注册,当它被销毁时,它会使用DBResourceMonitor的单例实例取消注册。当应用程序终止时,DBResrouceMonitor的全局实例将被销毁,它会检查以确保它监视的任何类没有剩余的已注册实例(即,对于每个寄存器,都会调用一个未注册的实例),并且如果存在不匹配,则发出TRACE输出和ASSERT。

这一切都很好......直到我把几个这样的数据库对象作为我的全局应用程序对象的成员。因此,全局应用程序对象和DBResourceMonitor都是全局单例,并且应用程序是第一个被构造的,因此最后被销毁,因此当DBResrouceMonitor被销毁时,成员app对象尚未取消注册,因此会抛出错误,指示注册/取消注册调用不匹配。

据我所知,没有办法确保在应用程序对象之前构造DBResrouceMonitor(因此在之后销毁)。

这是对的吗?有没有巧妙的解决方法,或者重新考虑上述方法,以便我仍然能够在最终线程终止之前跟踪是否所有事情都得到了解决?

2 个答案:

答案 0 :(得分:2)

您需要将对这些对象的引用存储在Singleton的集合属性中,而不是让对象使用单例注册/注销它们。所以不要这样做:

var x = new MyDBObject();

你会使用像:

这样的工厂模式
var x = DBResourceMonitor.GetDBObject();

在DBResourceMonitor中的某个地方,你可以管理一组MyDBObjects

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

}

答案 1 :(得分:2)

您可以让数据库对象与资源监视器相同,方法是让一个基类在其构造函数中“注册”数据库对象,并在(虚拟)析构函数中“取消注册”它。这样您就可以创建对象而不用担心单例或额外的监视器类。对象集合当然是这个基类中的私有静态成员,如果你使用多线程,可能会受到保护。

我也会使用std::unique_ptr代替原始指针,或者std::shared_ptr