重复连接和断开连接操作时ODBC32.lib中的内存泄漏

时间:2018-12-13 11:55:06

标签: c windows winapi memory-leaks odbc

当我反复调用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);
    }
}

}

这是循环前后分配的内存差异的快照,显示了泄漏的内容。 Memory snapshot

由于ODBC32.lib的使用已经有很多年了,所以我猜想是我做错了(或者没有做必须做的事情)导致泄漏的原因。

一些有趣的观察结果:

  1. 第一次迭代后,hdbc在所有迭代中都是相同的!
  2. 如果我把连接和断开连接放在同一个循环中, 数组中的句柄并稍后断开/释放它们,我看到了 泄漏少得多。此外,hdbc在每次迭代中都不同。

您是否在上面的代码中看到任何可能导致此泄漏的内容?我已经阅读了所有正在使用的功能的文档,但找不到任何明显的内容。

0 个答案:

没有答案