0

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

这一切都很好......直到我将这些数据库对象中的几个作为我的全局应用程序对象的成员。因此,全局应用程序对象和应用程序DBResourceMonitor都是全局单例,应用程序是第一个被构造的,因此是最后一个被销毁的,因此当DBResrouceMonitor被销毁时,应用程序对象的成员还没有被注销,并且所以它会抛出一个错误,表明存在不匹配的注册/注销调用。

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

它是否正确?有没有一种聪明的方法来解决这个问题,或者重新考虑上面的方法,以便我仍然可以跟踪在最终线程终止之前是否所有事情都得到了照顾?

4

2 回答 2

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.

}
于 2012-11-20T19:02:22.713 回答
2

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

我也会使用std::unique_ptr而不是原始指针,或者可能std::shared_ptr.

于 2012-11-20T19:15:52.843 回答