You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已释放动态分配内存仍出现内存泄漏的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:33:11