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

标签 mysql c pointers

这是一个真正的新手问题,但我不会写 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/

相关文章:

c++ - 为什么 C++ 引用被认为比指针更安全?

sql - 每个账户多于一张信用卡

c - 简单 C 子/父程序中的意外终止

c - 是否可以将参数仅发送给一个函数(在 DLL 中),以便其他函数(在 DLL 中)知道该参数的值?

C - 将 char 指针传递给函数的段错误

c++ - 如何求和和减去 char* 数字?

php - 在 Homestead 不清楚的全新 Laravel 安装中连接到 MySQL

mysql - #1093 - 表被指定了两次,既作为 'UPDATE' 的目标又作为数据的单独源

mysql - 帮助复杂的mysql查询

c - C 中的合并排序算法无法正常工作