和 D.Shawley 一样,我以前从未使用过这些功能,所以我写了一个小测试程序,它会泄漏内存。
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
int fx(const void *a, const void *b) {
if (*(int*)a < *(int*)b) return -1;
return (*(int*)a > *(int*)b);
}
int main(void) {
int i, *elem;
void *root = NULL, *val;
for (i = 0; i < 10; i++) {
elem = malloc(sizeof *elem); /* LEAK, leak, leak */
*elem = i/2;
val = tsearch(elem, &root, fx); /* assume all OK */
printf("i: %d; elem: %p (%d); val: %p (%x)\n",
i, (void*)elem, *elem, val, *(int*)val);
}
for (i = -1; i < 6; i++) {
val = tfind(&i, &root, fx);
printf("i: %d; ", i);
if (val) {
printf("@%p (%x)\n", val, *(int*)val);
} else {
printf("NOT FOUND\n");
}
}
return 0;
}
运行它输出
我:0;元素:0xcb8010(0);值:0xcb8030 (cb8010)
我:1;元素:0xcb8060(0);值:0xcb8030 (cb8010)
我:2;元素:0xcb8080(1);值:0xcb80a0 (cb8080)
我:3;元素:0xcb80d0(1);值:0xcb80a0 (cb8080)
我:4;元素:0xcb80f0(2);值:0xcb8110 (cb80f0)
我:5;元素:0xcb8140(2);值:0xcb8110 (cb80f0)
我:6;元素:0xcb8160(3);值:0xcb8180 (cb8160)
我:7;元素:0xcb81b0(3);值:0xcb8180 (cb8160)
我:8;元素:0xcb81d0(4);值:0xcb81f0 (cb81d0)
我:9;元素:0xcb8220(4);值:0xcb81f0 (cb81d0)
我:-1;未找到
我:0;@0xcb8030 (cb8010)
我:1;@0xcb80a0 (cb8080)
我:2;@0xcb8110 (cb80f0)
我:3;@0xcb8180 (cb8160)
我:4;@0xcb81f0 (cb81d0)
我:5;未找到
显然,“二叉树内部”的值是指向数据的指针的副本。副本由<search.h>
函数管理,数据应由程序管理。
内存0xcb8030
应该通过调用来释放tdelete()
,相应的0xcb8010
(值为0的elem)应该由程序释放(以及之前丢失的0xcb8060
)。