2012-04-01 2 views
2

를 반환 라이브러리 함수를 사용하지만 (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; 
+1

피할 수 없다면 C를 쓰지 않습니까? C를 써야만 피할 수 있습니다. :) –

+0

Mind = blown (: - – d11wtq

+0

하하 "피할 수 있다면"또는 "피할 수 없다면"귀하의 경우에 효과가 있습니다. 영어 만 C만큼 간단하면 맞습니까? –

답변

4

당신은 결과가 결과입니다 mysql_free_result(result)를 호출해야 mysql_fetch_fields C 개발자는이 프로그래밍 패러다임에 익숙하지만 다른 라이브러리에 할당 된 것을 해제하기 위해 호출하는 함수는 하나도 없습니다. 각 라이브러리에는 무언가를 할당하고 반환하는 함수가 있고 할당 결과를 해제하는 함수가 있습니다. 클라이언트는 다른 힙에 할당 될 수 있으므로 free 또는 delete을 사용하여 자체를 해제 할 수 없으며 내부에 다중 할당이있는 복합 개체 일 수 있습니다.

1

지금까지 사용했던 API 참조는 대답을 제공,

mysql_store_result()가 설정 한 결과에 할당 된 메모리를 해제합니다 mysql_use_result()을 : 당신은 mysql_free_result() 기능을 사용하여 결과 세트에서 메모리를 확보해야 , mysql_list_dbs() 등. 결과 집합을 사용하여 을 수행 한 경우 mysql_free_result()을 호출하여 사용하는 메모리를 해제해야합니다.

결과 세트를 해제 한 후 액세스하려고 시도하지 마십시오.

예, C 프로그래머는 반환 된 객체에 대해 _free() 루틴을 제공하는 API에 많이 사용됩니다. 그것은 단지 영토의 일부입니다.

0

함수 mysql_store_result은 쿼리의 전체 결과를 힙에 저장하고 모든 데이터에 대한 포인터가 들어있는 구조체를 반환합니다. mysql_fetch_rowmysql_fetch_fields과 같은 기능은이 데이터 중 일부만 반환합니다.함수 mysql_free_resultmysql_fetch_fields을 포함하여 전체 결과 데이터를 반환해야합니다.

따라서 데이터를 사용한 후에 mysql_free_result으로 전화하면 작업을 수행 할 수 있습니다.