首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时调用mysql_free_result (Resuing mysql_store_result,MYSQL_RES)

问何时调用mysql_free_result (Resuing mysql_store_result,MYSQL_RES)
EN

Stack Overflow用户
提问于 2013-05-29 06:12:00
回答 1查看 3.3K关注 0票数 11

我有两个代码(程序)

程序1:

代码语言:javascript
复制
//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);
}

"Other Code“包含一个for循环,它调用使用相同res_set存储来自mysql_store_result的结果的函数。正如所见,我只在main末尾调用mysql_free_result(res_set);一次。

valgrind显示了上述情况下的still reachable内存问题(我选择忽略这个问题)。没有其他泄漏。

程序2:

类mysqlClientClass有以下私有变量,

代码语言:javascript
复制
MYSQL *connect;
MYSQL_RES *res_set; 
MYSQL_ROW row;

其中一些方法(与我的问题相关),

代码语言:javascript
复制
mysqlClientClass::~mysqlClientClass()
{
if(connect!=NULL)
{   
    mysql_free_result(res_set);
    mysql_close(connect);   
}
}

如果用户未能调用closeConnection,析构函数将关闭它(通过检查connect是否设置为NULL或否)

代码语言:javascript
复制
void mysqlClientClass::closeConnection()
{
    mysql_free_result(res_set);
    mysql_close(connect);
    connect = NULL;
}

getResults是整个代码中唯一使用mysql_store_result的方法。

代码语言:javascript
复制
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中释放它),并且对这个函数进行几次调用,

代码语言:javascript
复制
=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

代码语言:javascript
复制
==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_store_result()将查询的整个结果读入客户端,为分配MYSQL_RES结构,并将结果放入该结构。

它还建议我应该在使用后调用free_result。

程序2(当我不调用mysql_free_result**) 时内存泄漏,但是为什么程序1没有显示任何泄漏呢?)在程序1中,我也会在不同函数之间调用** mysql_store_result ,而不需要每次释放。。

EN

回答 1

Stack Overflow用户

发布于 2013-06-26 02:17:02

您不需要mysql_store_result从查询中获取数据--使用sqlite3_exec回调

代码语言:javascript
复制
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
    }
}

从未有过这种方法的任何漏洞

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16806704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档