我想使用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用户可以指出一种避免内存泄漏的方法吗?
答案 0 :(得分:0)
JudyHS无法迭代。因此,不能直接在条目上循环并释放值的典型解决方案。您的选择是:
1)使用JudySL并限制您的密钥中没有NULL字节。如果您需要NULL字节,那么您也可以考虑将密钥转换为转义格式(即NULL字节是多字节转义序列的格式。)
2)将JudyHS与您可以迭代的另一个ADT结合起来。这种复杂程度取决于您的使用案例。如果您在JudyHS中添加和删除内容,那么可以通过比1)更有效的方式来实现这一点。如果你只添加entires,那么一个简单的链表,指针数组或JudyL就可以了。