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

如何查看HEAP可用空间及清理未调用free()的链表内存

如何查看堆可用空间及清理未释放的链表内存

嘿,我来帮你一步步解决这个堆内存相关的问题,分三个部分给你讲清楚:

一、查看当前堆(HEAP)的可用空间

不同操作系统的方法不一样,我分别说下Linux和Windows下的常用方式:

Linux环境

  • 最简单的方式是调用malloc_stats()函数,它会直接打印出堆的详细统计数据,包括已分配内存、空闲内存等信息,直接在代码里调用就行,记得包含stdlib.h或者malloc.h头文件。
  • 如果想自己获取数据做计算,可以用mallinfo(),它返回一个struct mallinfo结构体,里面的字段能帮你算出可用空间:
#include <malloc.h>
#include <stdio.h>

int main() {
    struct mallinfo heapInfo = mallinfo();
    printf("已分配堆内存: %d 字节\n", heapInfo.uordblks);
    printf("空闲堆内存: %d 字节\n", heapInfo.fordblks);
    printf("近似总可用堆内存: %d 字节\n", heapInfo.fordblks + heapInfo.usmblks);
    return 0;
}

Windows环境

Windows下可以用HeapWalk()来遍历进程堆,统计所有空闲块的大小:

#include <windows.h>
#include <stdio.h>

void showHeapFreeSpace() {
    HANDLE processHeap = GetProcessHeap();
    PROCESS_HEAP_ENTRY heapEntry;
    SIZE_T totalFree = 0;

    heapEntry.lpData = NULL;
    while (HeapWalk(processHeap, &heapEntry)) {
        if (!(heapEntry.wFlags & PROCESS_HEAP_ENTRY_BUSY)) {
            totalFree += heapEntry.cbData;
        }
    }

    printf("当前堆空闲空间: %zu 字节\n", totalFree);
}

二、清理未调用free()的链表占用的堆内存

你的代码里创建了链表节点但没释放,这会造成内存泄漏。要清理的话,得写一个遍历链表的释放函数,逐个释放每个节点的内存,还要注意链表结构体本身的内存(如果是堆上分配的):

首先假设你的链表结构体是常见的这种定义(你没给出,我补一个通用版):

typedef struct LNODE {
    int value;
    struct LNODE* next;
} LNODE;

typedef struct {
    LNODE* head;
    LNODE* tail;
} LIST;

然后写释放函数:

void freeLinkedList(LIST* list) {
    if (list == NULL) return;

    LNODE* current = list->head;
    LNODE* nextNode;

    // 遍历每个节点,逐个释放
    while (current != NULL) {
        nextNode = current->next;
        free(current); // 释放当前节点的堆内存
        current = nextNode;
    }

    // 如果makeEmptyList()是用malloc创建的LIST结构体,这里要释放它
    // 如果LIST是栈上的局部变量,这行可以删掉
    free(list);
}

然后在你的main()函数最后调用这个函数就行:

int main() {
    // 你的原有代码...
    printList(&lst);

    // 清理链表占用的堆内存
    freeLinkedList(&lst); // 如果lst是栈变量就传&lst,堆变量直接传lst
    return 0;
}

⚠️ 划重点:每个用malloc()/calloc()创建的节点都要被free(),漏一个都会导致内存泄漏哦!

三、查看清理后的堆可用空间

清理完链表内存后,再调用前面说的malloc_stats()(Linux)或者showHeapFreeSpace()(Windows),就能看到堆的空闲空间增加了——因为你释放的内存已经回到堆里,可以被后续的内存分配复用了。

另外提一句,Linux终端里的free -m命令能看系统整体内存,但这是系统级的,不是你当前进程的堆空间,所以还是用代码里的函数更准确。


内容的提问来源于stack exchange,提问作者learnCforme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:32:41