我正在尝试在C中实现二叉树。我有
struct treenode {
int value;
struct treenode *left;
struct treenode *right;
};
typedef struct treenode Tree;
void insert(Tree **tree, int value);
但是得到“在1个对象中直接泄漏24个字节”。 编辑:用{{编译1}}如建议给出正确的行。没有AddressSantitizer运行工作正常。但是我没有看到内存泄漏的位置:摆脱llvm-symbolizer
不会给我泄漏发生的实际行,但使用printf
我已将执行跟踪到下面标记的行。-g
并释放current
似乎是这样做的,但我不明白为什么这两者都是泄密:newNode
只是指向现有已分配内存的指针,current
即将插入树中。
编辑:感谢所有评论/回答的人。我误解了asan如何报告其结果;泄漏是因为我在newNode
中释放tree->left
之前没有释放tree
,正如评论者建议的那样。
使用GCC而不是Clang进行编译不会产生错误。对于Clang,我有
main
对于GCC我有
% clang -O1 -g -fsanitize=address -fno-omit-frame-pointer -Wall -Werror -Wextra binarytree.c
Clang输出
% gcc -O1 -fsanitize=address -fno-omit-frame-pointer -Wall -Werror -Wextra binarytree.c
=================================================================
==24939==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x49a1bb in __interceptor_malloc (/home/lidavidm/Code/learnc/binarytree+0x49a1bb)
#1 0x4b795d in insert (/home/lidavidm/Code/learnc/binarytree+0x4b795d)
#2 0x4b7d54 in main (/home/lidavidm/Code/learnc/binarytree+0x4b7d54)
#3 0x7fa87fff703f in __libc_start_main (/usr/lib/libc.so.6+0x2003f)
Indirect leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x49a1bb in __interceptor_malloc (/home/lidavidm/Code/learnc/binarytree+0x49a1bb)
#1 0x4b7b9c in insert (/home/lidavidm/Code/learnc/binarytree+0x4b7b9c)
#2 0x4b7d95 in main (/home/lidavidm/Code/learnc/binarytree+0x4b7d95)
#3 0x7fa87fff703f in __libc_start_main (/usr/lib/libc.so.6+0x2003f)
SUMMARY: AddressSanitizer: 48 byte(s) leaked in 2 allocation(s).
的实施:
insert
答案 0 :(得分:2)
代码还可以,除了过于冗长和多余 比较:
void insert(Tree **tree, int value) {
while(*tree)
tree = value >= tree[0]->value ? &tree[0]->right : &tree[0]->left;
*tree = malloc(sizeof **tree);
**tree = (Tree){.value = value};
}
所以,泄漏显然是在其他地方。