这是一个真正的新手问题,但我不会写 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 开发人员已经习惯了这种编程范式,但是没有一个函数可以调用来释放在另一个库中分配的东西。每个库都有分配和返回某些东西的函数,然后是释放分配结果的函数。客户端无法使用 free
或 delete
自行释放它,因为它可能分配在不同的堆上,并且可能是一个内部有多个分配的复杂对象。
关于mysql - 使用返回数组的库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969057/