在我的应用程序中,我面临内存泄漏。完整的应用程序是多线程的,每个线程都通过 ODBC 驱动程序 13.1 连接到同一个数据库(Microsoft SQL Server 2014 SP3)。应用程序打开并动态关闭它需要的记录集。
我正在研究我的代码,现在我将矛头指向记录集 Close()
函数。我写了这个导致内存泄漏给我的示例代码。
CCellsSet 是Visual Studio 向导制作的Consumer ODBC MFC 类,继承自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;
}
最佳答案
如果在构造 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/