调研:t_zset删除操作 zslDelete(zs-zsl,score,c-argv[j]) int zslDelete(zskiplist *zsl, double score, robj *obj) void zslDeleteNode(zskiplist *zsl, zskiplistNode *x, zskiplistNode **update) void zslFreeNode(zskiplistNode *node zskiplistNode *
调研:t_zset删除操作
zslDelete(zs->zsl,score,c->argv[j])
int zslDelete(zskiplist *zsl, double score, robj *obj)
void zslDeleteNode(zskiplist *zsl, zskiplistNode *x, zskiplistNode **update)
void zslFreeNode(zskiplistNode *node
zskiplistNode *node中的成员都能访问,说明zfree(node)并没有释放node, 什么时候实现回收。实际上,free(ptr)告诉操作系统回收*ptr空间(如:将该空闲块链接到可用链表),但是该块的内容并未清空,故使用ptr仍能访问*ptr空间。
注意:当ptr1和ptr2同时指向zskiplistNode时,通过zfree(ptr1)告诉操作系统回收*ptr1(zskiplistNode),但是ptr2仍然指向zskiplistNode这片空间,所以ptr2仍能访问zskiplistNode的内容。
内存泄露,链表删除节点,使用free(ptr),和ptr = NULL之间的关系,free仅告诉os回收资源,而ptr指针仍存放这片空间的地址,指向这片空间,如果未设置读写保护,ptr依旧能访问这片空间的内容;所以free(ptr)之后,显式设置ptr为NULL,避免出现不可预期的错误(读到不该读的或写入不该写的空间)。
冒号表达式使用
lr > 0?pnode->rchild:pnode->lchild = NULL;
必须使用int i = (boolean expression)? A:B;