b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c 链表的定义和使用 cjson 源码阅读笔记(4)

电脑杂谈  发布时间:2017-12-31 09:23:46  来源:网络整理

因此 cjson 还专门为 数组定义了下面的批量创建节点。

/* These utilities create an Array of count items. */
cJSON *cJSON_CreateIntArray(const int *numbers,int count);
cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
cJSON *cJSON_CreateStringArray(const char **strings,int count);

另外, 当我们要添加的节点已经在一个树上的时候, 再向另一个树中添加这个节点时, 这个节点的 pre 和 next 指针会被覆盖。

于是 cjson 又提供了一种引用性添加节点的方法。

简单的说就是在创建一个 item, 新创建的 item 的 value 指针直接指向原来的 value 值, 这样两个 item 就指向了同一个 item 了。

但是这个引用计数是个难题, cjson 也没有处理好, 只能引用一次, 大家可以想象怎么解决。

我们先来看看 cjson 的引用是怎么实现的。

/* Utility for handling references. */
static cJSON *create_reference(cJSON *item) {
    cJSON *ref=cJSON_New_Item();
    if (!ref) return 0;
    memcpy(ref,item,sizeof(cJSON));
    ref->string=0;
    ref->type|=cJSON_IsReference;
    ref->next=ref->prev=0;
    return ref;
}

上面的引用计数仅仅存在 type 里面,显示是有问题的。

我们的 value 是保持不变的,所有的引用都指向这个value.

所以我们可以通过一个和 value 类似的东西, 大家都指向这个 东西, 新增加一个引用的时候加1, 释放一个引用的时候减一即可。

这个看着怎么那么像智能指针呢?

这个话题就说到这吧,实现方式很多的,大家自己多想想。

删除也是从 array 和 object 中删除,实现就比较简洁了。

void   cJSON_DeleteItemFromArray(cJSON *array,int which) {
    cJSON_Delete(cJSON_DetachItemFromArray(array,which));
}
void   cJSON_DeleteItemFromObject(cJSON *object,const char *string) {
    cJSON_Delete(cJSON_DetachItemFromObject(object,string));
}

Detach 是什么东西呢?

我们把一个节点从 json 树中删除, 但是不释放内存,而是先保留这个节点的指针, 这样储存在这个节点的信息都保留了下来。

接下来我们就可以做很多事了, 合适的时候添加到其他对象中, 合适的时候释放内存。

比如上面的 delete 函数, 就需要真实的删除了, 这个时候我们删除即可。

而 detach 实现也比较简单, 只是少了一步删除操作。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...