首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两个类上协调析构函数,其中一个类需要首先清理

在两个类上协调析构函数,其中一个类需要首先清理
EN

Stack Overflow用户
提问于 2019-09-09 06:58:25
回答 1查看 35关注 0票数 0

假设我创建了一个CDatabase和一个CStatement类。CStatement类的一些句柄依赖于CDatabase类。

代码语言:javascript
复制
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释放它的句柄是很重要的。

问题是,如果两个对象都在一个方法中被声明为局部的,那么关于哪个对象将首先获得它的析构函数就会有一些问题。

我的一个想法是让CStatementCDatabase中调用RegisterStatement方法。这样,如果CDatabase析构函数首先被调用,它可以调用任何CStatement对象中的方法,这取决于它在释放自己的句柄之前。我还可以添加一个UnregisterStatementCStatement可以从它的析构函数中调用它,这样CDatabase就知道如果它首先被销毁了,就不会调用它。

但是调用UnregisterStatement方法是有问题的,因为CDatabase类可能已经被销毁了。

有没有人知道解决这个问题的可靠方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 07:02:04

如果两者都在一个函数中声明为局部,那么必须首先声明CDatabase,因为CStatement在构造函数中接受它。因此,它将在最后被销毁。具有自动持续时间的对象总是以与构造相反的顺序被销毁。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57846362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档