我使用c ++ mysql连接器在我的mysql数据库中执行操作。
我的c ++程序是一个实时应用程序(rest api),它总是在云端运行,总是在等待用户请求。
当我为第一种类型启动程序时,我会自动创建与数据库的连接(从配置文件加载的连接器的字段)。例如:
conDataBase = new ConDatabase;
if (!conDataBase->Init()) return false;
conDataBase是一个可供所有类访问的全局指针。
Init()
函数:
bool conDatabase::Init()
{
GetParameterStr("DATABASE", "HOST", "", hostname, 255);
db_hostname = hostname;
GetParameterStr("DATABASE", "USER", "", user, 255);
db_user = user;
GetParameterStr("DATABASE", "PASSWORD", "", password, 255);
db_password = password;
GetParameterStr("DATABASE", "SCHEMA", "", schema, 255);
db_schema = schema;
printf("DATABASE: Connecting to %s \n",db_hostname.c_str());
printf("DATABASE: Connecting at %s with user %s \n",db_schema.c_str(), db_user.c_str());
try
{
driver = get_driver_instance();
con = driver->connect(db_hostname.c_str(), db_user.c_str(), db_password.c_str());
con->setSchema(db_schema.c_str());
stmt = con->createStatement();
printf("DATABASE: Connected to database... OK \n");
return true;
}
catch (sql::SQLException &e)
{
std::cout << "# ERR: SQLException in " << __FILE__;
std::cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << std::endl;
std::cout << "# ERR: " << e.what();
std::cout << " (MySQL error code: " << e.getErrorCode();
std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
return false;
}
}
因此,当我收到一个请求,例如在userInfo请求类中列出userInfo时,我会调用数据库类的全局指针,如下所示:
conDataBase->GetUserInfo(// the parameters);
在GetUserInfo()
内部构建我的查询:
res = stmt->executeQuery(query);
它的工作但我真正的疑问是:它是必要的从mysqlconnector(res, pstmt, con, etc
)删除指针?我对未来的内存泄漏感到恐惧。我只是在程序退出时删除指针,但这是一个实时程序原因,为什么不期望他完成。如果我删除每个查询中的指针,插入等(如mysqlconnector
示例)下次我有分段错误,因为当我第一次运行程序时,我创建数据库指针con, res, etc,
所以我不能删除每个数据库操作中的这些指针,因为如果我这样做,下次指针被删除,我没有访问他及其结果分段错误。在这些情况下,什么是防止内存泄漏的解决方案?
答案 0 :(得分:0)
对于这种情况,您可以编写 connectionManager 类。它可用于为:
提供api1-创建和维护连接池,
2- getConnection api从池中获取连接实例
3-一个释放连接api,用于将连接实例放回打开的连接池中,
4-你应该使用stl容器来存储打开的连接等