1

libjudy を使用して、固定長のバイト配列をキーとする情報を格納するデータ構造を構築したいと考えています。つまり、JudyHS 構造を使用する必要があります。コードとドキュメントの私の理解に基づいて、キーは単一の機械語で構成される要素にのみアクセスできます。ヒープに割り当てられた構造体へのポインターを保存したいので、これは問題ありません。ただし、以前に格納された要素を反復する方法がないように見えるという問題があり、構造体 (JHSFA) の割り当てを解除するために使用されるマクロは、データの単語を格納するために使用されるメモリで free() を呼び出しますが、ワードが指すメモリを呼び出し元のコードが解放できるようにするメカニズムは提供されません。valgrind と次のサンプル コードを使用して、JHSFA がユーザー提供のメモリの割り当てを解除しないことを確認しました。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <judy.h>

int
main(
  const int argc,
  const char *argv[]
)
{
  Pvoid_t table = (PWord_t)NULL;
  const size_t allocSize = sizeof("bar") + 1;
  char *bar = calloc(1, allocSize);
  strncpy(bar, "bar", allocSize);
  uint64_t key = UINT32_MAX + 1;
  PWord_t entry;
  JHSI(entry, table, &key, sizeof(key));
  *entry = (Word_t)bar;
  entry = NULL;
  JHSG(entry, table, &key, sizeof(key));
  if (!strncmp(bar, (const char *)(*entry), allocSize)) {
    printf("match\n");
  }
  else {
    printf("no match\n");
  }
  Word_t result;
  JHSFA(result, table);
}

これが事実であることを考えると、このデータ構造がデータを保存する唯一の場所である場合、他のlibjudyユーザーがメモリリークを回避する方法を教えてくれますか?

4

1 に答える 1

0

JudyHS は反復できません。したがって、エントリをループして値を解放するという一般的な解決策は、直接的には不可能です。オプションは次のとおりです。

1) JudySL を使用し、キーに NULL バイトが含まれないように制限します。NULL バイトが必要な場合は、キーをエスケープ形式 (つまり、NULL バイトがマルチバイトのエスケープ シーケンスである形式) に変換することも検討してください。

2) JudyHS を反復可能な別の ADT と結合します。これは、ユースケースによって複雑さが異なります。JudyHS に何かを追加したり削除したりする場合、1) よりも効率的な方法でこれを行うことができるかどうかは疑わしいです。全体を追加するだけの場合は、単純なリンク リスト、ポインターの配列、または JudyL が機能します。

于 2013-02-01T17:10:21.973 に答える