Ну так загляните в исходники драйвера для ODBC, посмотрите что именно выделяется (какая структура данных?), кто ее должен освобождать, когда...
Может нужно просто делать close соединению, при обнаружении отключения.
Old, спасибо за комментарий.
В код глядел, ничего гиперстрашного не увидел, все переменные локальные, ничего там не создается динамически.
    QVarLengthArray<SQLTCHAR> connOut(1024);
    memset(connOut.data(), 0, connOut.size() * sizeof(SQLTCHAR));
    r = SQLDriverConnect(d->hDbc,
                          NULL,
                          toSQLTCHAR(connQStr).data(),
                          (SQLSMALLINT)connQStr.length(),
                          connOut.data(),
                          1024,
                          &cb,
                          /*SQL_DRIVER_NOPROMPT*/0);
    if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) {
        setLastError(qMakeError(tr("Unable to connect"), QSqlError::ConnectionError, d));
        setOpenError(true);
        return false;
    }
По вызову close() делается и cleanup(), в котором есть пара SQLFreeHandle.
Но моя проблема в том, что я имею утечку памяти еще ДО ТОГО, как я установил соединение. Т.е. программа запускается, пробует соединиться, не получается, через 30 секунд пробует снова и так далее.
Хотя я делал close() при неудачной попытке соединения - это не влияло на ситуацию.