C++ odbc 关闭记录集泄漏内存

标签 c++ visual-c++ memory-leaks odbc recordset

在我的应用程序中,我面临内存泄漏。完整的应用程序是多线程的,每个线程都通过 ODBC 驱动程序 13.1 连接到同一个数据库(Microsoft SQL Server 2014 SP3)。应用程序打开并动态关闭它需要的记录集。

我正在研究我的代码,现在我将矛头指向记录集 Close() 函数。我写了这个导致内存泄漏给我的示例代码。

CCellsSet 是Visual Studio 向导制作的Consumer ODBC MFC 类,继承自CRecordset。

我也尝试过更新的 SQL Server 版本,但我遇到了同样的情况。

在我的机器上,每对 rs.Open() 和 rs.Close() 都会导致大约 1Kb 的泄漏。

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

关于C++ odbc 关闭记录集泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56035337/

相关文章:

c++ - System::String to char* 函数..内存泄漏?

c - 由于 malloc 导致地址越界和内存泄漏

java - 防止可能由于线程导致的堆内存不足异常

c++ - boost日志的使用,Valgrind检查内存泄漏

c++ - 为什么这不交换两个节点?

c++ - 无法从映射中恢复指向成员函数的指针

c++ - 尝试在同一类中创建类 vector 时出现错误

c++ - KD-Tree 构建例程中的严重错误

c++ - C++ 中 int 的最小大小是多少?

c++ - u_int32_t 是什么?