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;
}
それを実行すると出力
i:0; elem:0xcb8010(0); val:0xcb8030(cb8010)
i:1; elem:0xcb8060(0); val:0xcb8030(cb8010)
i:2; elem:0xcb8080(1); val:0xcb80a0(cb8080)
i:3; elem:0xcb80d0(1); val:0xcb80a0(cb8080)
i:4; elem:0xcb80f0(2); val:0xcb8110(cb80f0)
i:5; elem:0xcb8140(2); val:0xcb8110(cb80f0)
i:6; elem:0xcb8160(3); val:0xcb8180(cb8160)
i:7; elem:0xcb81b0(3); val:0xcb8180(cb8160)
i:8; elem:0xcb81d0(4); val:0xcb81f0(cb81d0)
i:9; elem:0xcb8220(4); val:0xcb81f0(cb81d0)
i:-1; 見つかりません
i:0; @ 0xcb8030(cb8010)
i:1; @ 0xcb80a0(cb8080)
i:2; @ 0xcb8110(cb80f0)
i:3; @ 0xcb8180(cb8160)
i:4; @ 0xcb81f0(cb81d0)
i:5; 見つかりません
どうやら「二分木の中」の値はデータへのポインタのコピーです。コピーは<search.h>
関数によって管理され、データはプログラムによって管理される必要があります。
メモリ0xcb8030
はへの呼び出しによって解放される必要がありtdelete()
、対応する0xcb8010
(値0のelem)はプログラム(および以前に失われた0xcb8060
)によって解放される必要があります。