gpt4 book ai didi

带 Splint 的 MySQL C API : Freeing fields and rows

转载 作者:行者123 更新时间:2023-11-29 23:57:20 25 4
gpt4 key购买 nike

我正在尝试使用 Splint使用 MySQL C API 并遇到了一些与释放内存相关的其他问题。在我能找到的有关使用 C API 的所有示例中,唯一调用的释放函数是 mysql_free_result,但行和字段永远不会被释放:

while ((row = mysql_fetch_row(result))) 
{
for(int i = 0; i < num_fields; i++)
{
if (i == 0)
{
while(field = mysql_fetch_field(result))
{
// Bla
}
}
}
}

mysql_free_result(result);
mysql_close(con);

Splint 当然会抛出一个错误,指出行和字段存在内存泄漏。他们是吗?如何解决这个问题?我应该手动释放行和字段结构吗?

编辑:好的,因为当没有更多行时mysql_fetch_row返回null,我假设它还会在每个循环中释放前一行的所有内存。但我到底该怎么告诉 Splint 这件事呢?

编辑2:这是mysql_fetch_row(版本5.5)的实现。没有分配内存,该函数只是将您指向下一行。因此,我们需要为该函数添加一个 Splint 注释,告诉 Splint 没有分配内存,而是共享内存。

MYSQL_ROW STDCALL
mysql_fetch_row(MYSQL_RES *res)
{
DBUG_ENTER("mysql_fetch_row");
if (!res->data)
{ /* Unbufferred fetch */
if (!res->eof)
{
MYSQL *mysql= res->handle;
if (mysql->status != MYSQL_STATUS_USE_RESULT)
{
set_mysql_error(mysql,
res->unbuffered_fetch_cancelled ?
CR_FETCH_CANCELED : CR_COMMANDS_OUT_OF_SYNC,
unknown_sqlstate);
}
else if (!(read_one_row(mysql, res->field_count, res->row, res->lengths)))
{
res->row_count++;
DBUG_RETURN(res->current_row=res->row);
}
DBUG_PRINT("info",("end of data"));
res->eof=1;
mysql->status=MYSQL_STATUS_READY;
/*
Reset only if owner points to us: there is a chance that somebody
started new query after mysql_stmt_close():
*/
if (mysql->unbuffered_fetch_owner == &res->unbuffered_fetch_cancelled)
mysql->unbuffered_fetch_owner= 0;
/* Don't clear handle in mysql_free_result */
res->handle=0;
}
DBUG_RETURN((MYSQL_ROW) NULL);
}
{
MYSQL_ROW tmp;
if (!res->data_cursor)
{
DBUG_PRINT("info",("end of data"));
DBUG_RETURN(res->current_row=(MYSQL_ROW) NULL);
}
tmp = res->data_cursor->data;
res->data_cursor = res->data_cursor->next;
DBUG_RETURN(res->current_row=tmp);
}
}

最佳答案

共享只读存储的正确注释是/*@observer@*/。为了共享可写存储,可以使用 /*@exposed@*/

/*@observer@*/ MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

更多内容请参见 Splint manual .

关于带 Splint 的 MySQL C API : Freeing fields and rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25247757/

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