C ++ odbc закрыть набор записей утечки памяти - PullRequest
1 голос
/ 08 мая 2019

В моем приложении я сталкиваюсь с утечками памяти.Полное приложение является многопоточным, и каждый поток подключается к одной и той же БД (Microsoft SQL Server 2014 SP3) через драйвер ODBC 13.1.Приложение открывает и динамически закрывает необходимый набор записей.

Я изучаю свой код и теперь указываю пальцем на функцию набора записей Close().Я написал этот пример кода, который вызывает утечку памяти для меня.

CCellsSet - это класс потребительского ODBC MFC, созданный Visual Studio Wizard, который наследует от CRecordset.

Я также пробовал использовать более свежие версии SQL Server, но у меня был такой же сценарий.

На моей машине каждая пара rs.Open () и rs.Close () вызывает утечку около 1Kb.

Здесь ссылка на Open и Close на msdnв связи с этим достаточно вызвать Close (), чтобы избежать утечек.

void Test(CDatabase* ptr_db)
{
    CCellsSet rs;

    rs.m_pDatabase = ptr_db;

    rs.Open();

    rs.Close();
}

int main()
{
    CDatabase DB;

    DB.OpenEx("DSN=__myDNS__;UID=sa;PWD=__myPWD__", CDatabase::noOdbcDialog);

    for (long i = 0; i < 1000; i++)
    {
        printf("loop '%d' \n", i);

        Test(&DB);
    }

    if (DB.IsOpen())
    {
        DB.Close();
    }

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 08 мая 2019

Спасибо за ваш ответ. Я обновил свой код следующим образом, но утечки памяти все еще сохраняются

void Test(CDatabase* ptr_db)
{
    CCellsSet rs(ptr_db);

    rs.Open();

    rs.Close();
}

int main()
{
    CDatabase DB;

    DB.OpenEx("DSN=__myDNS__;UID=sa;PWD=__myPWD__", CDatabase::noOdbcDialog);

    for (long i = 0; i < 1000; i++)
    {
        printf("loop '%d' \n", i);

        Test(&DB);
    }

    if (DB.IsOpen())
    {
        DB.Close();
    }

    return 0;
}
0 голосов
/ 10 мая 2019

Спасибо, делакер!Это помогает мне сосредоточиться на том, где были настоящие утечки.

Фактически код, который я выложил ранее, не был утечкой в ​​памяти

0 голосов
/ 08 мая 2019

Когда не передается CDatabase * при создании CCellsSet, создается объект этого типа. После этого указатель на этот объект перезаписывается вами. Смотри https://docs.microsoft.com/en-us/cpp/mfc/reference/crecordset-class?view=vs-2017#crecordset

...