代码之家  ›  专栏  ›  技术社区  ›  Jonathan Wood

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

  •  0
  • Jonathan Wood  · 技术社区  · 5 年前

    假设我创建了一个 CDatabase 和A CStatement 上课。这个 C声明 类依赖于 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()
        {
            // ...
        }
    }
    

    重要的是 C声明 释放它的手柄之前 CDatabase公司 做。

    问题是如果两个对象都在一个方法中声明为本地的,那么对于哪个对象将首先调用它的析构函数存在一些问题。

    我的一个想法是 C声明 打电话给 RegisterStatement 方法 CDatabase公司 . 这边,如果 CDatabase公司 析构函数首先被调用,它可以在任何 C声明 依赖于它的对象在释放自己的句柄之前。我也可以加一个 UnregisterStatement 那个 C声明 可以从它的析构函数调用所以 CDatabase公司 如果它先被摧毁了就不会叫它了。

    但是打电话给 注销声明 方法是不可靠的,因为 CDatabase公司 类已被销毁。

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Igor Tandetnik    5 年前

    如果在函数中都声明为局部的,则 CDatabase 必须先声明,因为 CStatement 在构造函数中接受它。所以,它最后会被摧毁。具有自动持续时间的对象总是按与构造相反的顺序销毁。