【问题标题】:I have to call Destructor explicitly我必须明确调用析构函数
【发布时间】:2011-04-27 04:18:18
【问题描述】:
class TsDatabasePool
{
private:
    TsDatabasePool(int numDBConn, std::string& DBName, std::string& DBType);
            static  TsDatabasePool* objInst_;             
public:
           ~TsDatabasePool();               
    QSqlDatabase* borrowFromPool();      
    void returnToPool(QSqlDatabase*);
static bool createInstance(std::string& DBName, std::string& DBType);
static TsDatabasePool* getInstance();

};

我的析构函数没有被隐式调用。使用的对象实例 objInst_ 在私有构造函数中分配。我不想在任何现有函数中调用析构函数或调用 delete objInst_。谁能告诉我该怎么办

【问题讨论】:

    标签: c++ singleton destructor


    【解决方案1】:

    我相信您在这里尝试做的是销毁一个单例对象。
    在单线程环境中可以按如下方式完成:

    void TsDatabasePool::Destroy()  
    {   
        if (objInst_) 
        {        
            delete objInst_;       
            objInst_= 0x0;   
        } 
    } 
    

    理想情况下,您可以使用 shared_ptr 之类的东西来确保对象一直存在,直到没有人需要它为止。

    【讨论】:

      【解决方案2】:

      您可以使用 std::auto_ptr 模板代替原始指针。 std::auto_ptr 模板将在应用程序退出时自动在您的指针上调用 operator delete。

      【讨论】:

      • 真的没有必要在应用程序退出时调用delete。无论如何,应用程序退出都会破坏整个运行时上下文。
      • @aroth,系统会自动释放内存页面和文件句柄等系统级资源,但在析构函数中可能会实现重要的应用级清理操作,例如刷新缓冲区或优雅地关闭网络连接.
      【解决方案3】:

      在您解除分配objInst_ 之前,您不能调用该变量的析构函数。你一定要delete它。

      【讨论】:

        【解决方案4】:

        释放内存并调用objInst_的析构函数的正确方法是调用

        delete objInst_;
        

        不幸的是,你不能(不应该)调用析构函数,除非你删除它。这是 C++ 语言设计的一部分。

        由于 objInst_ 是静态的,您需要添加一个“static void shutdown()”方法并在代码中的某个位置调用它或使用 atexit 函数注册它。

        编辑:实现 objInst_ 是静态的。

        【讨论】:

        • objInst_ 是静态的。如果要调用析构函数,从析构函数调用delete objInst_ 将导致无限循环。
        • facepalm。我瞎了。已更新。
        猜你喜欢
        • 2022-01-17
        • 2014-01-28
        • 2018-07-03
        • 2013-09-21
        • 2015-12-31
        • 1970-01-01
        • 2019-08-25
        • 2021-10-23
        • 2017-08-17
        相关资源
        最近更新 更多