gpt4 book ai didi

mysql - 使用返回数组的库函数

转载 作者:行者123 更新时间:2023-11-29 01:31:48 26 4
gpt4 key购买 nike

这是一个真正的新手问题,但我不会写 C 除非(错误,如果)我可以避免它;)

我已经为需要与 libmysql 接口(interface)的 ruby​​ 编写了一个小扩展。它按预期工作,但现在我怀疑两行代码是否会导致可能的内存泄漏。

在一个紧密的循环中,我正在使用函数 MYSQL_FIELD * mysql_fetch_fields( ... )unsigned long * mysql_fetch_lengths( ... )

由于这些函数返回数组,我假设它们会使用malloc() 因此要求用户在完成时手动调用free()结果呢?我希望这会记录在手册中,但事实并非如此,所以我认为这是 C 开发人员本能地做的事情之一:http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-fields.html

有什么指点吗? (在建议意义上;))

有问题的代码在这里:https://github.com/d11wtq/oedipus/blob/master/ext/oedipus/oedipus.c#L137-138

编辑 |呃,现在我有一个疑问。记录了在传递给 mysql_fetch_fields() 的结果集上调用 mysql_free_result(),所以也许这只是返回指向堆上已有内容的指针, 来自那个 MYSQL_RES 结构。

编辑 2 |对不起噪音。看来这些信息只是从作为 mysql_fetch_fields() 的参数的 MYSQL_RES 结构中提取的,并且稍后会被释放,所以我可能没问题:

typedef struct st_mysql_res {
my_ulonglong row_count;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
const struct st_mysql_methods *methods;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
MEM_ROOT field_alloc;
unsigned int field_count, current_field;
my_bool eof; /* Used by mysql_fetch_row */
/* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled;
void *extension;
} MYSQL_RES;

最佳答案

您需要调用 mysql_free_result(result),其中 result 是 mysql_fetch_fields 的结果。 C 开发人员已经习惯了这种编程范式,但是没有一个函数可以调用来释放在另一个库中分配的东西。每个库都有分配和返回某些东西的函数,然后是释放分配结果的函数。客户端无法使用 freedelete 自行释放它,因为它可能分配在不同的堆上,并且可能是一个内部有多个分配的复杂对象。

关于mysql - 使用返回数组的库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969057/

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