Visual C ODBC关闭记录集泄漏内存

visual C++ odbc close recordset leaks memory

本文关键字:泄漏 内存 关闭记录集 ODBC Visual      更新时间:2023-10-16

在我的应用程序中,我将面临内存泄漏。完整的应用程序是多线程,每个线程通过ODBC驱动程序13.1连接到同一DB(Microsoft SQL Server 2014 SP3(。应用程序打开并动态关闭所需的记录设置。

我正在调查我的代码,现在我将手指指向记录集Close()功能。我写了此示例代码,导致内存泄漏。

ccellsset是由Visual Studio向导制造的消费者ODBC MFC类,它是从crecordset继承的。

我还尝试了最近的SQL Server版本,但我的场景相同。

在我的机器上,每对rs.open((和rs.close((导致泄漏约1kb。

在此处引用在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;
}

在构造ccellsset时不传递cdatabase*时,创建了该类型的对象。之后,指向该对象的指针被您覆盖。请参阅https://learn.microsoft.com/en-us/cpp/mfc/reference/crecordset-class?view=vs-2017#crecordset

感谢DeLeaker!它可以帮助我集中真正的泄漏。

事实上,我之前发布的代码没有泄漏在内存中