我必须显式调用析构函数

发布于 2024-11-03 16:26:44 字数 552 浏览 5 评论 0原文

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_ 。谁能告诉我我该怎么办

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();

};

My destructor is not called implicitly. Object instance used objInst_ is allocated in private constructor. I dont want to call destructor or call delete objInst_ inside any existing function. Can anyone tell me what should i do

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不必了 2024-11-10 16:26:57

在释放 objInst_ 之前,您无法调用该变量的析构函数。您确实需要删除它。

Until you deallocate objInst_, you can not call the destructor for that variable. You need to delete it for sure.

白馒头 2024-11-10 16:26:57

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

delete objInst_;

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

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

编辑:意识到 objInst_ 是静态的。

The correct way to free memory and call the destructor for objInst_ is to call

delete objInst_;

Unfortunately, you cannot (should not) call the destructor unless you also delete it. This is part of the design of the C++ language.

Since objInst_ is static you will need to add a "static void shutdown()" method and call it at some point in your code or register it with atexit function.

Edit: realized objInst_ is static.

聊慰 2024-11-10 16:26:56

您可以使用 std::auto_ptr;模板而不是原始指针。 std::auto_ptr 模板将在应用程序退出时自动调用指针上的运算符删除。

You can use std::auto_ptr<TsDatabasePool> template instead of raw pointer. std::auto_ptr template will call operator delete on your pointer automatically at application exit.

鲸落 2024-11-10 16:26:52

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

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

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

I believe what you are trying to do here is destroy a singleton object.
It can be done as follows in a Singlethreaded Enviornment:

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

Ideally, You can use something like shared_ptr to ensure that the object stays around until no-one needs it any more.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文