我有 2 个代码(程序)
方案一:
//global variables
MYSQL_RES *res_set;
MYSQL_ROW row;
MYSQL *connect;
int main()
{
connect=mysql_init(NULL);
mysql_real_connect(connect, NULL, "root", "suvp" ,"Employees" ,0,NULL,0);
/*Other Code*/
mysql_free_result(res_set);
mysql_close(connect);
}
“其他代码”涉及一个 for 循环,该循环调用使用相同的函数res_set
来存储结果的函数mysql_store_result
。如图所示,我mysql_free_result(res_set);
只在 main 结束时调用了一次。
valgrind
显示still reachable
上述情况下的内存问题(我选择忽略)。不存在其他泄漏。
方案二:
mysqlClientClass 类具有以下私有变量,
MYSQL *connect;
MYSQL_RES *res_set;
MYSQL_ROW row;
一些方法是(与我的问题相关),
mysqlClientClass::~mysqlClientClass()
{
if(connect!=NULL)
{
mysql_free_result(res_set);
mysql_close(connect);
}
}
如果用户调用失败closeConnection
,析构函数将关闭它(通过检查是否connect
设置为 NULL 或否)
void mysqlClientClass::closeConnection()
{
mysql_free_result(res_set);
mysql_close(connect);
connect = NULL;
}
getResults
是整个代码中唯一使用的方法mysql_store_result
void mysqlClientClass::getResults(string iQuery)
{
/* form query
execute Query */
res_set = mysql_store_result(connect);
/* Do other things */
mysql_free_result(res_set); // ------------------------>
res_set = NULL;
}
}
如果我不释放res_set
函数末尾的 (并且close Connection
只在析构函数中释放它 / )并且我多次调用这个函数 valgrind 报告,
=10162== LEAK SUMMARY:
==10162== definitely lost: 312 bytes in 3 blocks
==10162== indirectly lost: 49,152 bytes in 9 blocks
==10162== possibly lost: 0 bytes in 0 blocks
==10162== still reachable: 73,872 bytes in 21 blocks
==10162== suppressed: 0 bytes in 0 blocks
==10162== Reachable blocks (those to which a pointer was found) are not shown.
==10162== To see them, rerun with: --leak-check=full --show-reachable=yes
==10162==
==10162== For counts of detected and suppressed errors, rerun with: -v
==10162== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
这一切都归结为mysql_store_result
==10162== by 0x406C3CA: mysql_store_result (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==10162== by 0x8048E03: mysqlClientClass::getResults(std::string) (mysqlClientClass.cpp:103)
根据手册页mysql_store_result
mysql_store_result() 将查询的整个结果读取到客户端, 分配一个 MYSQL_RES 结构,并将结果放入该结构中。
它还建议我应该free_result
在使用后打电话。
这似乎按照程序 2 中的记录工作(当我不调用时内存泄漏mysql_free_result
),但是为什么程序 1 没有显示任何泄漏?在程序 1 中,我也在各种函数之间进行了多次调用,mysql_store_result
而不是每次都释放。