我已经释放了动态分配的内存,但我仍然遇到内存泄漏

I have free'd dynamically allocated memory, but I am still getting memory leaks

提问人:Cindy_ l 提问时间:10/24/2023 最后编辑:Cindy_ l 更新时间:10/24/2023 访问量:61

问:

我目前正在用 C 语言进行作业,并且我已经动态分配了我的结构、linkedlist 和一个 2d 数组。在代码的末尾,我也释放了这些内容。我无法显示我的所有代码,因为它是一项作业,可能更难查看问题。不过,我可以提供代码片段。

下面是我的 linkedlist 的 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++;
}

在这种方法中,我已经对newNd进行了恶意定位,但我无法释放,因为它会导致分段错误。

我尝试使用 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)

如果需要更多代码,请告诉我,我会看看我能提供多少,谢谢!

C 内存 内存泄漏 malloc valgrind

评论

0赞 Fe2O3 10/24/2023
loc = findLoc('P', arr, row, col);,例如,重新分配已为“d...这不可能是健康的......代码太少,无法多说...(指针也一样......malloc()carloc
0赞 Cindy_ l 10/24/2023
好的,谢谢。我只是更改了传入 loc 的方法,而不是返回它。这已经修复了一些内存泄漏,但我仍在尝试找出其余的问题。
1赞 Fe2O3 10/24/2023
不热衷于尝试进行“锁孔诊断/手术”。为了将来参考,请不要更改您的问题,以致使您收到的评论/答案无效。如果您对另一个代码块有单独的问题,请发布一个新问题。
0赞 Cindy_ l 10/24/2023
下次还会做,感谢您的反馈
0赞 CGi03 10/24/2023
temp 在您的代码中用于什么?你对此无能为力。

答: 暂无答案