C++ 为什么我的析构函数没有被调用?
程序退出时未调用我的析构函数。对象是一个单身汉,也许我遗漏了什么 以下是标题和cpp文件: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
#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;