已释放动态分配内存仍出现内存泄漏的C语言问题求助
C语言链表内存泄漏排查求助
我正在完成一项C语言作业,已为结构体、链表以及二维数组分配了动态内存,并且在代码末尾执行了free操作,但仍然存在内存泄漏问题。由于作业要求,无法展示全部代码,但可以提供代码片段。
以下是链表的insertStart函数:
void insertStart(LinkedList* list, void* entry) { Position* temp; void* newEntry = malloc(sizeof(Position)); ListNode* newNd = (ListNode*)malloc(sizeof(ListNode)); temp = (Position*)entry; memcpy(newEntry, entry, sizeof(Position)); newNd->data = newEntry; newNd->next = list->head; list->head = newNd; list->size++; }
在该函数中,通过malloc分配了newNd,但无法对其执行free操作,否则会导致段错误。使用valgrind检测内存泄漏,得到如下结果:
==1906== ==1906== HEAP SUMMARY: ==1906== in use at exit: 1,332 bytes in 40 blocks ==1906== total heap usage: 72 allocs, 32 frees, 14,676 bytes allocated ==1906== ==1906== 60 bytes in 3 blocks are indirectly lost in loss record 1 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA1B: insertStart (linkedList.c:23) ==1906== by 0x1099DA: controls (game.c:141) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 60 bytes in 3 blocks are indirectly lost in loss record 2 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA1B: insertStart (linkedList.c:23) ==1906== by 0x109811: controls (game.c:111) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 72 bytes in 3 blocks are indirectly lost in loss record 3 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA29: insertStart (linkedList.c:24) ==1906== by 0x1099DA: controls (game.c:141) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 72 bytes in 3 blocks are indirectly lost in loss record 4 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA29: insertStart (linkedList.c:24) ==1906== by 0x109811: controls (game.c:111) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 120 bytes in 6 blocks are indirectly lost in loss record 5 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA1B: insertStart (linkedList.c:23) ==1906== by 0x1098F8: controls (game.c:126) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 140 bytes in 7 blocks are indirectly lost in loss record 6 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA1B: insertStart (linkedList.c:23) ==1906== by 0x109AC1: controls (game.c:156) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 144 bytes in 6 blocks are indirectly lost in loss record 7 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA29: insertStart (linkedList.c:24) ==1906== by 0x1098F8: controls (game.c:126) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 168 bytes in 7 blocks are indirectly lost in loss record 8 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10AA29: insertStart (linkedList.c:24) ==1906== by 0x109AC1: controls (game.c:156) ==1906== by 0x109596: game (game.c:44) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== 472 bytes in 1 blocks are still reachable in loss record 9 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x48DF64D: __fopen_internal (iofopen.c:65) ==1906== by 0x48DF64D: fopen@@GLIBC_2.2.5 (iofopen.c:86) ==1906== by 0x109347: main (main.c:26) ==1906== ==1906== 860 (24 direct, 836 indirect) bytes in 1 blocks are definitely lost in loss record 10 of 10 ==1906== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1906== by 0x10A9D1: createLinkedList (linkedList.c:11) ==1906== by 0x1094DC: game (game.c:30) ==1906== by 0x109455: main (main.c:59) ==1906== ==1906== LEAK SUMMARY: ==1906== definitely lost: 24 bytes in 1 blocks ==1906== indirectly lost: 836 bytes in 38 blocks ==1906== possibly lost: 0 bytes in 0 blocks ==1906== still reachable: 472 bytes in 1 blocks ==1906== suppressed: 0 bytes in 0 blocks ==1906== ==1906== For lists of detected and suppressed errors, rerun with: -s ==1906== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
若需要更多代码片段,请告知,谢谢!
内容的提问来源于stack exchange,提问作者Cindy_l
相关产品推荐
相关产品推荐

