Я должен вызвать Деструктор явно - PullRequest
1 голос
/ 27 апреля 2011
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_ внутри любой существующей функции. Может кто-нибудь сказать мне, что я должен делать

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Я считаю, что вы пытаетесь здесь уничтожить одноэлементный объект.
В однопоточной среде это можно сделать следующим образом:

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

В идеале, вы можете использовать что-то вроде shared_ptr, чтобы гарантировать, что объект остается, пока никто больше не будет нуждаться в этом.

2 голосов
/ 27 апреля 2011

Вы можете использовать шаблон std :: auto_ptr вместо необработанного указателя.Шаблон std :: auto_ptr автоматически вызывает оператор delete для вашего указателя при выходе из приложения.

0 голосов
/ 27 апреля 2011

Правильный способ освободить память и вызвать деструктор для objInst_ - это вызвать

delete objInst_;

К сожалению, вы не можете (не должны) вызывать деструктор, если только также не удалите его.Это часть дизайна языка C ++.

Поскольку objInst_ является статическим, вам нужно добавить метод «static void shutdown ()» и вызвать его в какой-то момент в коде или зарегистрировать его с помощью atexit функция.

Редактировать: понял, что objInst_ является статическим.

0 голосов
/ 27 апреля 2011

Пока вы не освободите objInst_, вы не можете вызвать деструктор для этой переменной.Вам нужно delete это точно.

...