1

我想使用 libjudy 构建一些数据结构来存储以固定长度字节数组为键的信息,这意味着我需要使用 JudyHS 结构。根据我对代码和文档的理解,键只能访问由单个机器字组成的元素,这很好,因为我想保存指向在堆上分配的结构的指针;但是,存在一个问题,似乎没有办法遍历先前存储的元素,并且用于释放结构的宏 (JHSFA) 在用于存储数据字的内存上调用 free(),但是没有提供允许调用代码释放单词指向的内存的机制。我验证了 JHSFA 不会使用 valgrind 和以下示例代码取消分配用户提供的内存:

#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 回答