gpt4 book ai didi

c - GLib 哈希表未返回正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:19 25 4
gpt4 key购买 nike

我在内存结构下的 GLib 哈希表中添加了几个键值对。键是从 malloc 返回的 (char *) 指针。该值是分配的 malloc 大小。

void addstomemstruct(struct memory *mem, char *key_address, size_t sz) {
g_hash_table_insert(mem->singleton, key_address, &sz);
printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(mem->singleton, key_address)), key_address);
}

后来我去根据key去取value的时候,返回的size(value)一直是10,这是我最后加入哈希表的value

size_t get_blocksize(GHashTable *hashtable, char *key_address, size_t *result_flag)
{ size_t *sz_ptr = (size_t *) g_hash_table_lookup(hashtable, key_address);
...

char *logmsg;asprintf(&logmsg,"In get_blocksize: *sz_ptr=%Zu\n",*sz_ptr);
log_msg(logmsg);

printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(hashtable, key_address)), key_address);
...
}

打印输出:

preparing to add pointer: 0x9b52f10
** adding size: 1
** retrieving size: 1 add=0x9b52f10
preparing to add pointer: 0x9b52f48
** adding size: 2
** retrieving size: 2 add=0x9b52f48
preparing to add pointer: 0x9b52f58
** adding size: 3
...
preparing to add pointer: 0x9b52fc8
** adding size: 10
** retrieving size: 10 add=0x9b52fc8

然后当我尝试检索第一个值时:

In get_blocksize: *sz_ptr=10
** retrieving size: 10 add=0x9b52f10
Freed address 0x9b52f10. Size: 10. mem->stats->active_count=9, mem->stats->active_size=45.

最佳答案

您正在将一个指向自动存储持续时间变量(函数参数)的指针作为哈希表值传递。当它超出范围时,访问它是未定义的行为。

您可以:

  • 使用 malloc/gnewsz 分配存储空间,并在创建哈希表时注册适当的 value_destroy_func
  • 利用 size_t 值适合指针这一事实并将其转换为 gpointer。从技术上讲,这是一个 UB,但应该适用于大多数平台。除非小对象分配被确定为瓶颈,否则可能不应该这样做。

关于c - GLib 哈希表未返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595200/

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