使用odbc驱动来访问oracle10g数据库时,发现一个问题:
我们连接到数据库SQLConnect后,程序内存大约开始增加5000K,使用SQLDisconnect,并且free各种HANDLE后程序内存依然没有被释放。 有没有什么办法解决这个问题?
以下是程序,是下载的的官方demo修改的。 SQLConnect这个地方,就算没有连接成功,内存也会增加。
#undef UNICODE
#include
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
SQLHENV hEnv = NULL;
SQLHDBC hDbc = NULL;
SQLHSTMT hStmt = NULL;
int ret = 0;
// Allocate an environment
printf("Alloc henv...\n");
system("pause");
if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR)
{
printf("Unable to allocate an environment handle\n");
exit(-1);
}
// Register this as an application that expects 3.x behavior,
// you must register something if you use AllocHandle
SQLSetEnvAttr(hEnv,
SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,
0);
// Allocate a connection
SQLCHAR dsn[32] = "ORCL";
SQLCHAR user[32] = "SCOTT";
SQLCHAR passwd[32] = "tiger";
printf("Alloc hdbc...\n");
system("pause");
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
//792K
SQLSetConnectAttr(hDbc, SQL_LOGIN_TIMEOUT, 0, 0);
//796K
printf("connect...\n");
system("pause");
ret = SQLConnect(hDbc,dsn,SQL_NTS,user,SQL_NTS,passwd,SQL_NTS);
printf("connect ret : %d\n", ret);
//5956K
#if 0
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
// Free ODBC handles and exit
if (hStmt)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
}
ret = SQLEndTran(SQL_HANDLE_DBC, hDbc, SQL_COMMIT);
printf("commit ret : %d\n", ret);
ret = SQLEndTran(SQL_HANDLE_DBC, hDbc, SQL_ROLLBACK);
printf("rollback ret : %d\n", ret);
#endif
printf("disconnect...\n");
system("pause");
ret = SQLDisconnect(hDbc);
printf("disconnect ret : %d\n", ret);
if (hDbc)
{
printf("free hdbc...\n");
system("pause");
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
}
//5824K
if (hEnv)
{
printf("free henv...\n");
system("pause");
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}
printf("done...\n");
system("pause");
//5548K
return 0;
}