当我反复调用SQLConnect()
和SQLConnect()
时,我发现Windows上SQLDisconnect()
的内存泄漏。
这是一个非常简单的程序,每次迭代泄漏大约150kB。
int main() {
for (int i = 0; i < 10; ++i)
{
SQLHENV henv;
SQLHDBC hdbc;
SQLRETURN retcode;
// Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
// Connect to data source
retcode = SQLConnect(hdbc, (SQLCHAR*) "MySQL", SQL_NTS, (SQLCHAR*) "test", 0, (SQLCHAR*) "test", 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}
}
由于ODBC32.lib
的使用已经有很多年了,所以我猜想是我做错了(或者没有做必须做的事情)导致泄漏的原因。
一些有趣的观察结果:
hdbc
在所有迭代中都是相同的!hdbc
在每次迭代中都不同。您是否在上面的代码中看到任何可能导致此泄漏的内容?我已经阅读了所有正在使用的功能的文档,但找不到任何明显的内容。