를 반환 라이브러리 함수를 사용하지만 (ERR, 경우) 내가 그것을 피할 수 없다면 나는 C를 작성하지, 나는 그 필요 루비에 작은 확장을 작성했습니다이 정말 초보 질문 배열
) libmysql과 인터페이스 할 수 있습니다. 그것은 예상대로 작동하지만 지금은 두 줄의 코드가 메모리 누수의 원인이되는지 여부에 대해서는 의심의 여지가 있습니다.
좁은 루프 안에는 기능 MYSQL_FIELD * mysql_fetch_fields(...)
과 unsigned long * mysql_fetch_lengths(...)
이 사용됩니다. 이러한 기능은 배열을 반환 때문에
, 나는 그들이 그러므로 결과 완료되면 수동으로 free()
를 호출하는 사용자를 필요로 malloc()
을 사용 같은데요? 나는 이것이 매뉴얼에 문서화 될 것을 기대했지만, 그렇지 않다. 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 구조체의 힙에있는 포인터로 반환됩니다.
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를 써야만 피할 수 있습니다. :) –
Mind = blown (: - – d11wtq
하하 "피할 수 있다면"또는 "피할 수 없다면"귀하의 경우에 효과가 있습니다. 영어 만 C만큼 간단하면 맞습니까? –