【发布时间】:2021-08-15 14:35:47
【问题描述】:
我在 valgrind 中遇到此错误
==399==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 240 byte(s) in 15 object(s) allocated from:
#0 0x7f2a8cfadb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
#1 0x401371 in push /src/main.c:88
#2 0x401725 in buildTree /src/main.c:126
#3 0x4027e1 in encode /src/main.c:31
#4 0x402c8b in main /src/main.c:432
#5 0x7f2a8c761b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
我的推送功能:
void push(Heap* heap, Node* node) {
if (heap->heapSize + 1 >= heap->capacity) {
int capacity_ = heap->capacity * 2;
qNode** arr_ = realloc(heap->arr,sizeof(qNode) * capacity_);
heap->arr = arr_;
heap->capacity = capacity_;
}
heap->arr[heap->heapSize] = (qNode*) malloc(sizeof(qNode)); //line 88, where the leak occurs
heap->arr[heap->heapSize]->data = node;
heap->arr[heap->heapSize]->priority = node->count;
heap->heapSize = heap->heapSize + 1;
for (int i = (heap->heapSize/2)-1; i > -1; i--) {
heapify(heap, i);
}
}
我不明白为什么会发生泄漏,因为在程序结束时我清除了整个堆->arr
void freeHeap(Heap* heap) {
for (int i = 0; i < heap->heapSize; i++) {
freeTree(heap->arr[i]->data);
free(heap->arr[i]);
}
free(heap->arr);
free(heap);
}
【问题讨论】:
-
尝试注释掉
heapify并重新运行您的程序,只是猜测您在heapify中有错误。 -
对于未来的项目,请尝试在每个部分之间进行测试(如运行 Valgrind)以分段方式进行。您添加的每个和平都应该非常小并且易于单独测试。请记住在构建时启用额外警告并将它们视为必须修复的错误。
-
对于您当前的项目,如果您使用的是 VCS(版本控制系统,例如 Git),则回滚直到错误消失。然后一个一个地重新应用每个提交,直到它出现,你就知道是哪段代码导致了它。如果您没有使用 VCS,请逐句注释代码语句(同时确保您不会留下指针访问等),直到它消失。取消注释直到它返回并且最后一块可能是导致它的那个。
-
我的两分钱:
qNode** arr_ = realloc(heap->arr,sizeof(qNode) * capacity_);应该是qNode** arr_ = realloc(heap->arr,sizeof(qNode *) * capacity_);,因为heap->arr是 qNode 指针数组,而不是 n qNode 结构的分配空间。更重要的是,您应该始终检查来自malloc、calloc和realloc的返回指针,它们可能会失败。如果不这样做,可能会导致泄漏(失败的realloc将不会释放原始指针)。
标签: c memory-leaks valgrind