- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有2个代码(程序)
程序 1:
//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
的结果。如图所示,我只在 main 结束时调用 mysql_free_result(res_set);
一次。
valgrind
在上述情况下显示still reachable
内存问题(我选择忽略)。不存在其他泄漏。
程序 2:
类 mysqlClientClass 有以下私有(private)变量,
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)
根据 manual mysql_store_result
的页面
mysql_store_result() reads the entire result of a query to the client, allocates a MYSQL_RES structure, and places the result into this structure.
它还建议我应该在使用后调用 free_result
。
这似乎在程序 2 中按照记录工作(当我不调用 mysql_free_result
时内存泄漏)但是为什么程序 1 没有显示任何泄漏?在程序 1 中,我也在各种函数之间对 mysql_store_result
进行了多次调用,但每次都没有释放。
最佳答案
您不需要 mysql_store_result
从查询中获取数据 - 使用回调与 sqlite3_exec
int ListDataCallback(void *pArg, int argc, char **argv, char **columnNames){
//cast pArg to your user data pointer
//argc - count of columns in the result
//argv - a result field as string
return 0;
}
void get_data()
{
char *selectErrMsgP = NULL;
int err = sqlite3_exec( database, selectQ, ListDataCallback, (void*)myUserData, &selectErrMsgP );
if( err ) {
//handle error
}
}
这种方法从未有过任何泄漏
关于c++ - 何时调用 mysql_free_result (Resuing mysql_store_result, MYSQL_RES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16806704/
这个问题已经存在: 9年前关闭。 Possible Duplicate: Warning: mysql_fetch_* expects parameter 1 to be resource, bool
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
在我的站点上,数据库在几分钟后断开连接,并在几分钟后自动连接......我认为这是由于超过了 mysql 连接......我应该使用 mysql_free_result() 或 mysql_close
我一直在使用 Dreamweaver 开发基于 PHP 和 MySQL 的网站,但由于它往往会过度处理简单的事情,所以我通常会编写自己的查询和 PHP 来处理结果。 在完成一个更复杂的页面后,我最多可
我知道所有关联的结果内存在脚本执行结束时自动释放。但是,如果我使用了很多如下类似的操作,您会推荐使用它吗? $sql = "select * from products"; $result = mys
我只是 PHP 编码的新手。我目前正在开发一个带有分页的简单系统。我想知道使用分页时是否需要释放收集的结果并关闭连接? 提前致谢! 代码如下: View Records
此代码在释放结果之前测试是否有结果: $result = mysql_query($query) or die("$query\n\n" . mysql_error()); $id = mysql_i
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我有2个代码(程序) 程序 1: //global variables MYSQL_RES *res_set; MYSQL_ROW row; MYSQL *connect; int main() {
我试图从数据库中获取一个值并将其存储在全局变量中,如下所示: mysql_query(con, query); MYSQL_RES *result = mysql_store_result(con);
我是一名优秀的程序员,十分优秀!