使用JSHFA()宏释放libjudy Judy Hash Set(JudyHS)数据结构时如何避免内存泄漏?

时间:2012-11-30 21:18:16

标签: c memory-leaks

我想使用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用户可以指出一种避免内存泄漏的方法吗?

1 个答案:

答案 0 :(得分:0)

JudyHS无法迭代。因此,不能直接在条目上循环并释放值的典型解决方案。您的选择是:

1)使用JudySL并限制您的密钥中没有NULL字节。如果您需要NULL字节,那么您也可以考虑将密钥转换为转义格式(即NULL字节是多字节转义序列的格式。)

2)将JudyHS与您可以迭代的另一个ADT结合起来。这种复杂程度取决于您的使用案例。如果您在JudyHS中添加和删除内容,那么可以通过比1)更有效的方式来实现这一点。如果你只添加entires,那么一个简单的链表,指针数组或JudyL就可以了。