Я наблюдаю утечку памяти в 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);
}
}
}
Вот снимок разницы в памяти, выделенной до и после цикла, показывающий, что происходит утечка.
Так как ODBC32.lib
используется очень многими людьми на протяжении стольких лет, я полагаю, что я делаю что-то неправильно (или не делаю то, что я должен сделать), что вызываетэта утечка.
Пара наблюдений, которые могут быть интересны:
- После первой итерации
hdbc
одинаково на всех итерациях! - Вместовыполняя соединение и разъединение в том же цикле, если я помещаю маркеры в массив и позже отключаю / освобождаю их, я вижу, что утечка намного меньше.Кроме того,
hdbc
отличается в каждой итерации.
Видите ли вы что-нибудь в коде выше, что может быть причиной этой утечки?Я прочитал документацию по всем функциям, которые я использую, и не смог найти ничего очевидного.