使用CFDictionarySetValue()将结构体存储为值
storing struct as value using CFDictionarySetValue()
我刚开始使用Core Foundations。我想用字典来存储键值对。该值必须是指向结构体的指针。这个指针指向动态分配的缓冲区。
CFMutableDictionaryRef init_hash_table() {
return CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
}
用于创建字典,返回值作为全局变量存储。
CFNumberRef
create_hash_key(int sd) {
return CFNumberCreate(NULL, kCFNumberIntType, &sd);
}
int
add_hash_entry(CFMutableDictionaryRef dict, int sd, void *pkt) {
CFNumberRef key = create_hash_key(sd);
CFDictionarySetValue(dict, key, pkt);
return 0;
}
当我执行这段代码时,我得到段错误。我看到pkt有一个有效的地址,密钥似乎已经创建。有人知道如何分配一个指针值部分吗?
程序接收到EXC_BAD_ACCESS信号,无法访问内存。原因:KERN_INVALID_ADDRESS地址:0x00000000000000110x00007fff8c9f339f in objc_msgSend_fixup ()
任何想法?
问题是kCFTypeDictionaryValueCallBacks
参数。来自文档:
kCFTypeDictionaryValueCallBacks
预定义的CFDictionaryValueCallBacks
结构,包含一组当CFDictionary
中的值为时适合使用的回调所有CFType
派生的对象
所以在你的例子中,当值被添加到指针上时,CFRetain()
被调用字典。这会导致崩溃,因为指针没有指向CoreFoundation对象。
你可以用
创建字典CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, NULL);
,这样就不会对该值进行"引用计数"。
或者,您可以将指针包装到CFDataRef
中,并将其放入字典。
在这两种情况下,指针仍然有效是你的责任当稍后从字典中检索值时。
下面是一个简单的示例,说明如何实现自定义对象的重新计数:
typedef struct {
int refcount;
int val;
} mystruct;
const void *myretain(CFAllocatorRef allocator, const void *value)
{
mystruct *p = (mystruct *)value;
p->refcount++;
return p;
}
void myrelease(CFAllocatorRef allocator, const void *value)
{
mystruct *p = (mystruct *)value;
if (p->refcount == 1)
free(p);
else
p->refcount--;
}
int main(int argc, const char * argv[])
{
mystruct *p = malloc(sizeof(*p));
p->refcount = 1;
p->val = 13;
CFDictionaryValueCallBacks vcb = { 0 , myretain, myrelease, NULL, NULL };
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &vcb);
int sd = 13;
CFNumberRef key = CFNumberCreate(NULL, kCFNumberIntType, &sd);
CFDictionarySetValue(dict, key, p);
// refcount == 2
myrelease(NULL, p);
// refcount == 1
mystruct *q = CFDictionaryGetValue(dict, key);
// refcount is still 1, "GetValue" does not increment the refcount
CFRelease(dict);
// object is deallocated
return 0;
}
相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- 如何使用迭代器指向结构体c++的向量
- 从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个
- 存储结构体的向量
- 在堆栈中存储结构体
- 当从固定结构体中存储的对象构建函数时,c++ lambda构建静态函数返回意外值
- 为什么结构体可以存储自己的大小?
- 如何在动态二维数组中存储数据,在结构体中声明,该结构体也被c++中的另一个结构体使用
- 使用CFDictionarySetValue()将结构体存储为值
- 如何在一个结构体中为多个函数全局存储数据