Утечка памяти в ODBC32.lib при повторных операциях подключения и отключения - PullRequest
0 голосов
/ 13 декабря 2018

Я наблюдаю утечку памяти в SQLConnect() в Windows, когда я неоднократно вызываю SQLConnect() и SQLDisconnect().

Вот очень простая программа, в которой утечка составляет около 150 КБ за одну итерацию.

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 отличается в каждой итерации.

Видите ли вы что-нибудь в коде выше, что может быть причиной этой утечки?Я прочитал документацию по всем функциям, которые я использую, и не смог найти ничего очевидного.

...