gpt4 book ai didi

c++ - 何时调用 mysql_free_result (Resuing mysql_store_result, MYSQL_RES)

转载 作者:可可西里 更新时间:2023-11-01 06:30:56 25 4
gpt4 key购买 nike

我有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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com