C++ 为什么我的析构函数没有被调用?

C++ 为什么我的析构函数没有被调用?,c++,oop,destructor,C++,Oop,Destructor,程序退出时未调用我的析构函数。对象是一个单身汉,也许我遗漏了什么 以下是标题和cpp文件: #ifndef MYSQLCONNECTOR_H #define MYSQLCONNECTOR_H /* Standard C++ headers */ #include <iostream> #include <string> /* MySQL Connector/C++ specific headers */ #include <driver.h> #inclu

程序退出时未调用我的析构函数。对象是一个单身汉,也许我遗漏了什么

以下是标题和cpp文件:

#ifndef MYSQLCONNECTOR_H
#define MYSQLCONNECTOR_H

/* Standard C++ headers */
#include <iostream>
#include <string>

/* MySQL Connector/C++ specific headers */
#include <driver.h>
#include <connection.h>
#include <statement.h>
#include <prepared_statement.h>
#include <resultset.h>
#include <metadata.h>
#include <resultset_metadata.h>
#include <exception.h>
#include <warning.h>

class MysqlConnector {
private:
    static bool instanceFlag;
    static MysqlConnector* mysqlConnector;

    MysqlConnector() {

    };
public:
    static sql::Driver *driver;
    static sql::Connection *conn;
    static MysqlConnector* getInstance();

    virtual ~MysqlConnector() {
        instanceFlag = false;
        conn->close();
        delete conn;
        std::cout << "called" << std::endl;
    };
private:

};

#endif  /* MYSQLCONNECTOR_H */
\ifndef MYSQLCONNECTOR\u H
#定义MYSQLCONNECTOR_H
/*标准C++头文件*/
#包括
#包括
/*MySQL连接器/C++特定的头文件*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类MysqlConnector{
私人:
静态布尔瞬时滞后;
静态MysqlConnector*MysqlConnector;
MysqlConnector(){
};
公众:
静态sql::Driver*驱动程序;
静态sql::连接*conn;
静态MysqlConnector*getInstance();
虚拟~MysqlConnector(){
instanceFlag=false;
conn->close();
删除conn;
std::cout setAutoCommit(0);
/*选择适当的数据库架构*/
连接->设置模式(“交换”);
}捕获(SQLException&e){

cout没有调用析构函数,因为没有人为使用
new
创建的对象调用
delete

mysqlConnector = new MysqlConnector(); // Where's the corresponding call to delete?

您可以考虑使用智能指针(我建议 STD::UnQuyGyPTR <代码> >,如果您能负担得起C++ 11)。当智能指针本身被破坏时,它会被自动封装在“封装代码”对象上的“代码>删除/代码>。< /P> 另一种可能是根本不使用指针,并且有一个类型为

MysqlConnector
getInstance()
的静态数据成员可以返回对该对象的引用(而不是指针)

static MysqlConnector* mysqlConnector;
是指向类的指针。获取实例时,它只返回此指针。需要在此静态指针上调用
delete
,才能调用析构函数

如果继续并在此指针上调用delete,请确保仅在程序终止时执行此操作,因为下次调用
getInstance()
将创建一个新对象

编辑-刚刚发现instanceFlag,因此它不会创建新实例,但会返回空指针

这是有问题的,因为您可能期望Singleton是同一个对象,但当然,创建它的新实例将意味着您的数据将不会持久(即使您正在访问Singleton)


不管怎样,操作系统都会回收内存,因此您最好公开连接关闭代码并自己调用它?

您可能应该了解人们对单例的看法。他们对单例的看法是什么,我来看看,参考?如果程序退出,那么这些新的
d对象就会被正确地删除?还是只有它们占用的内存被操作系统回收?@Koushik:不,除非调用
delete
,否则它们不会被销毁。调用
delete
可能不明确,就像使用智能指针之类的RAII包装器一样,但它必须在那里。如果没有,内存就会泄漏(除非使用了一些花哨的图案,但OP的问题并没有表明这一点)。然后,在进程终止时,由进程分配的内存将由操作系统收回。因此,在程序终止期间,如果未明确删除对象,则在以任何方式回收其内存时,对象将处于无效状态。我曾尝试使用auto_ptr,但我认为我做得不对。是否有一个单件somewh的示例在我可以通过之前?@Koushik:该对象没有处于无效状态,它可以处于有效状态,并且不会被销毁。但是,是的,在进程终止后,操作系统会回收内存。
static MysqlConnector* mysqlConnector;