C++使用ODBC连接数据库出现内存泄漏问题
我想实现一个数据库连接失败后,进行定时重连的功能,但是不知道为什么会出现内存内存泄漏的问题,特来请求各位大神。
为了方便提问,我把代码整理了一下,直接在一个死循环里一直连接数据库,然后再断开数据库,释放资源。程序运行后通过观察任务管理器,可以发现内存一直在增加。
目前发现在 SQLDisconnect 这个函数执行后,会申请一些内存,但好像没有释放,但是这个是系统API,看不到源码,不太确定是不是这个问题。
以下是我精简过后的代码:
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string>
#include <iostream>
int main() {
std::string connectString("filedsn=c:\\mssql.dsn");
while(true)
{
SQLRETURN retCode;
SQLCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen;
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);\
retCode = SQLDriverConnect(hdbc, NULL, (SQLCHAR *) connectString.c_str(),
(SQLSMALLINT)connectString.size(), connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_COMPLETE);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (hstmt) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
hstmt = NULL;
}
if (hdbc) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
hdbc = NULL;
}
if (henv) {
SQLFreeHandle(SQL_HANDLE_ENV, henv);
henv = NULL;
}
}
return 0;
}
mssql.dsn 信息如下:
[ODBC]
DRIVER=SQL Server
UID=sa
DATABASE=termsec2
SERVER=192.168.1.156
PORT=1433
PWD=123456
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论