假设我创建了一个CDatabase和一个CStatement类。CStatement类的一些句柄依赖于CDatabase类。
class CDatabase
{
public:
SQLHENV m_hEnv;
SQLHDBC m_hDBC;
CDatabase()
{
}
~CDatabase()
{
FreeHandles();
}
void FreeHandles()
{
// ...
}
}
class CStatement
{
public:
SQLHSTMT m_hStmt;
CDatabase* m_pDatabase;
CStatement(CDatabase* pDatabase)
{
m_pDatabase = pDatabase;
}
~CStatement()
{
FreeHandles();
}
void FreeHandles()
{
// ...
}
}在CDatabase之前,CStatement释放它的句柄是很重要的。
问题是,如果两个对象都在一个方法中被声明为局部的,那么关于哪个对象将首先获得它的析构函数就会有一些问题。
我的一个想法是让CStatement在CDatabase中调用RegisterStatement方法。这样,如果CDatabase析构函数首先被调用,它可以调用任何CStatement对象中的方法,这取决于它在释放自己的句柄之前。我还可以添加一个UnregisterStatement,CStatement可以从它的析构函数中调用它,这样CDatabase就知道如果它首先被销毁了,就不会调用它。
但是调用UnregisterStatement方法是有问题的,因为CDatabase类可能已经被销毁了。
有没有人知道解决这个问题的可靠方法?
发布于 2019-09-09 07:02:04
如果两者都在一个函数中声明为局部,那么必须首先声明CDatabase,因为CStatement在构造函数中接受它。因此,它将在最后被销毁。具有自动持续时间的对象总是以与构造相反的顺序被销毁。
https://stackoverflow.com/questions/57846362
复制相似问题