首页 > 解决方案 > 重复连接和断开操作时 ODBC32.lib 中的内存泄漏

问题描述

当我反复调用时,SQLConnect()我在 Windows 上看到内存泄漏。SQLConnect()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这么多年以来被这么多人使用,我想是我做错了什么(或者没有做我必须做的事情)导致了这个泄漏。

一些可能有趣的观察结果:

  1. 第一次迭代后,hdbc所有迭代都一样!
  2. 如果我将句柄放在一个数组中并稍后断开/释放它们,而不是在同一个循环中进行连接和断开连接,我会发现泄漏要少得多。hdbc每次迭代也是不同的。

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

标签: cwindowswinapimemory-leaksodbc

解决方案


推荐阅读