2012-04-01 6 views
2

を返すライブラリ関数を使用して;)これは本当に初心者の質問ですが、私はそれを避けることができます(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; 
+1

あなたがそれを避けることができない限り、あなたはCを書いていませんか?だからあなたはそれを避けることができるときだけCを書いていますか? :) –

+0

マインド=ブローン(: - – d11wtq

+0

ハハ「もし私がそれを避けることができれば」または「私がそれを避けることができない限り」あなたのケースではうまくいくでしょう。 –

答えて

4

あなたは結果が結果ですmysql_free_result(result)を呼び出す必要がありますmysql_fetch_fieldsです。 C開発者はこのプログラミングのパラダイムに慣れていますが、別のライブラリに割り当てられたものを解放するための関数はありません。各ライブラリには、何かを割り当てて返す関数と、割り当ての結果を解放する関数があります。クライアントはfreeまたはdeleteでそれ自体を解放することはできません。異なるヒープに割り当てられる可能性があり、内部に複数の割り当てを持つ複雑なオブジェクトである可能性があります。

1

あなたがこれまで使用してきたAPIのリファレンスが答えを提供します。あなたはmysql_free_result()機能を使用して結果セットからメモリを解放する必要があります。

mysql_store_result()によって、結果セットに割り当てられたメモリを解放し、 mysql_use_result()mysql_list_dbs()など。結果セットで が実行されているときは、使用するメモリを mysql_free_result()にコールして解放する必要があります。

結果セットを解放してからアクセスしないでください。

はい、Cプログラマは返されたオブジェクトに対して_free()のルーチンを提供するAPIによく使用されています。それは領土の一部です。

0

関数mysql_store_resultは、クエリの結果全体をヒープに格納し、すべてのデータへのポインタを含む構造体を返します。 mysql_fetch_rowmysql_fetch_fieldsのような関数は、このデータの一部を返します。mysql_free_result関数は、結果フィールド全体を解放する責任があり、フィールドmysql_fetch_fieldsが返されます。

したがって、データを使用した後にmysql_free_resultに電話する必要があります。これは作業を行います。

関連する問題