這確實是一個新手的問題,但除非(ERR,如果)我能避免它,我不寫C;)使用庫函數返回數組
我寫了一個小的延伸與紅寶石在需要與libmysql進行接口。它按預期工作,但現在我對兩行代碼是否導致內存泄漏有疑問。
在一個緊密的循環內我使用的功能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_free_result()
,該結果集被傳遞給mysql_fetch_fields()
,所以也許這只是從該MYSQL_RES結構中返回一個指向已經在堆上的指針。
編輯2 |對不起,噪音。但看來這些信息是剛剛從MYSQL_RES
結構這是一個參數mysql_fetch_fields()
拉,而它本身以後被釋放,所以我可能罰款:
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? :) – 2012-04-01 22:56:05
Mind = blown(: - – d11wtq 2012-04-01 22:57:42
哈哈「如果我可以避免它」或「除非我無法避免它」會適用於你的情況。如果只有英語像C一樣簡單,對嗎? – 2012-04-01 23:02:34