Innodb中rec_ゲットするオフセットの使用上の注意点


Innodbにrec_を使うゲットするoffsetsは一本のrec_を取得します.tの各フィールドのオフセット量
全体rec_ゲットするoffsetsの形式は以下の通りです.
/******************************************************//**
The following function determines the offsets to each field
in the record.  It can reuse a previously allocated array.
@return the new offsets */
UNIV_INTERN
ulint*
rec_get_offsets_func(
/*=================*/
const rec_t*        rec,    /*!< in: physical record */
const dict_index_t* index,  /*!< in: record descriptor */
ulint*          offsets,/*!< in/out: array consisting of
offsets[0] allocated elements,
or an array from rec_get_offsets(),
or NULL */
ulint           n_fields,/*!< in: maximum number of
initialized fields
(ULINT_UNDEFINED if all fields) */
mem_heap_t**        heap,   /*!< in/out: memory heap */
const char*     file,   /*!< in: file name where called */
ulint           line);  /*!< in: line number where called */
#define rec_get_offsets(rec,index,offsets,n,heap)
rec_get_offsets_func(rec,index,offsets,n,heap,__FILE__,__LINE__)
パラメータの説明:
  • recに対応するレコード
  • indexは、対応するインデックス
  • を記録する.
  • offsetsは、オフセット量結果を保存するためのポインタであり、事前に割り当てられたものであっても良いし、NULL
  • であっても良い.
  • n_fieldsが保存できる最大のオフセット量のフィールド数は、一般的にULIT__を使用することができます.UNDEFINEDで表示されていますが、制限はありません.UNDEFINEDは((ulint)(-1)です.
  • heapメモリヒープ.事前にoffsetsが割り当てられていない場合、その結果はheapにメモリを申請します.heapがNULLであれば、heapにもメモリを申請します.この場所はメモリリークを引き起こしやすいです.
    offsetsとheapの使用に注意してください.一つの不適切はメモリ漏れを引き起こします.
    標準的な使い方を見てください.
    ulint       offsets_[REC_OFFS_NORMAL_SIZE];
    ulint*      offsets             = offsets_;
    mem_heap_t* heap                = NULL;
    row_cache_chain_t* chain = NULL;
    rec_offs_init(offsets_);
    //TODO Someting
    if (UNIV_LIKELY_NULL(heap)) {
    mem_heap_free(heap);
    }
    return;
    最初に注意しなければならないのがrec_です.offsinit(offsets)このマクロの目的はオフセットです.の最初の配列単位の値は数値の大きさです.ゲットするoffsetsの内部はoffsetがすべての値を下に置くことができるかどうかを判断しなければならなくて、もし放すことができないならばheapにメモリを申請して、どのようにoffsetが足りないことを判断して、rec_が必要です.offsinit(offsets)を選択してサイズを初期化します
    上記の例で使われているheapはNULLで、外部はあらかじめheapのメモリを申請しないということです.ゲットするoffsetsの内部は自発的にheapの上でメモリを申請することができます.ゲットするoffsets内はheapでメモリを申請しましたが、freeはありません.外でまだ使われていますので、漏らしてはいけません.
    if (UNIV_LIKELY_NULL(heap)) {
    mem_heap_free(heap);
    }
    この段階では、一度漏れたら、メモリリークが発生する可能性が高く、また、このリークのトリガ条件は非常に厳しいです.初期化されたoffsets_からです.[RECUOFFIS恳NORMAL USIZE]は100個で、96個以上のフィールドが記録されている場合(内部は4つ予約されているので)、heapにメモリを申請します.freeがないと漏れてしまいます.