を返すライブラリ関数を使用して;)これは本当に初心者の質問ですが、私はそれを避けることができます(ERR、あれば)しない限り、私はCを書いていない配列
私はそれが必要なルビーする小さな拡張を書きましたlibmysqlとのインタフェース。期待どおりに動作しますが、今は2行のコードがメモリリークの可能性があるかどうか疑問に思っています。
タイトなループの中で私は関数MYSQL_FIELD * mysql_fetch_fields(...)
とunsigned long * mysql_fetch_lengths(...)
を使用しています。
これらの関数は配列を返すので、私は彼らが結果に終わったときに、手動でfree()
を呼び出すために、ユーザが必要なため、malloc()
を使用すると仮定?私はこれをマニュアルに書かれていると思っていましたが、そうではありませんので、これはC開発者が本能的にやっているものの1つと推測しています: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
EDIT |ああ、今私は疑いがある。これはmysql_fetch_fields()
に渡された結果セットのmysql_free_result()
を呼び出すことが記録されているので、おそらくこれはヒープ上にあるMYSQL_RES構造体からのポインタへのポインタを返すだけです。
EDIT 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;
あなたがそれを避けることができない限り、あなたはCを書いていませんか?だからあなたはそれを避けることができるときだけCを書いていますか? :) –
マインド=ブローン(: - – d11wtq
ハハ「もし私がそれを避けることができれば」または「私がそれを避けることができない限り」あなたのケースではうまくいくでしょう。 –