gpt4 book ai didi

c - 使用 JSHFA() 宏解除分配 libjudy Judy Hash Set (JudyHS) 数据结构时如何避免内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:37 24 4
gpt4 key购买 nike

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

最佳答案

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

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

2) 将 JudyHS 与您可以迭代的另一个 ADT 相结合。这取决于您的用例的复杂性。如果您在 JudyHS 中添加和删除内容,那么能否以比 1) 更有效的方式完成这一点值得怀疑。如果您只添加整体,那么简单的链表、指针数组或 JudyL 都可以。

关于c - 使用 JSHFA() 宏解除分配 libjudy Judy Hash Set (JudyHS) 数据结构时如何避免内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com