c - 重复连接和断开操作时 ODBC32.lib 中的内存泄漏
问题描述
当我反复调用时,SQLConnect()
我在 Windows 上看到内存泄漏。SQLConnect()
SQLDisconnect()
这是一个非常简单的程序,每次迭代泄漏大约 150kB。
int main() {
for (int i = 0; i < 10; ++i)
{
SQLHENV henv;
SQLHDBC hdbc;
SQLRETURN retcode;
// Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
// Connect to data source
retcode = SQLConnect(hdbc, (SQLCHAR*) "MySQL", SQL_NTS, (SQLCHAR*) "test", 0, (SQLCHAR*) "test", 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}
}
自从ODBC32.lib
这么多年以来被这么多人使用,我想是我做错了什么(或者没有做我必须做的事情)导致了这个泄漏。
一些可能有趣的观察结果:
- 第一次迭代后,
hdbc
所有迭代都一样! - 如果我将句柄放在一个数组中并稍后断开/释放它们,而不是在同一个循环中进行连接和断开连接,我会发现泄漏要少得多。
hdbc
每次迭代也是不同的。
您是否在上面的代码中看到任何可能导致此泄漏的内容?我已经阅读了我正在使用的所有功能的文档,但我找不到任何明显的东西。
解决方案
推荐阅读
- scala - 广播 Array[Row] 并在单独的包中使用它
- docker - 如何在 docker 容器内针对外部应用程序运行 cypress 测试
- java - JAXB 忽略 @XmlAttribute 注释
- seaborn - 如何并排绘制来自两个不同数据帧的计数图?
- javascript - 如何从对象中提取 pin 属性并在 JavaScript 中创建一个 pin 数组?
- r - 如何将数据框从宽转换为长并将一列的不同值分隔成新列?
- python - 根据标准融化多列熊猫数据框
- azure - Azure 事件中心中的 Apache Kafka 主题等效项
- python - 如果用户尝试仅传递几个字母,如何为电子邮件字段引发错误
- architecture - 我想解释一下我们可以在哪里使用微服务而不是容器以及它的一些应用程序