当前位置:  技术问答>linux和unix

请教一个内存释放的问题

    来源: 互联网  发布时间:2016-06-14

    本文导语:  本帖最后由 ding525 于 2009-06-22 15:24:52 编辑 typedef struct node { struct pcap_pkthdr header; u_int8_t* data; u_int32_t data_len; struct node *next; }Packet; Packet **packets_array; packets_array = (Packet **) malloc(400000 * sizeof(Packet*)); memset(packets_array, ...

本帖最后由 ding525 于 2009-06-22 15:24:52 编辑

typedef struct node
{
struct pcap_pkthdr header;
u_int8_t* data;
u_int32_t data_len;
struct node *next;
}Packet;
Packet **packets_array;
packets_array = (Packet **) malloc(400000 * sizeof(Packet*));
memset(packets_array, NULL, sizeof(Packet**) * 400000);
/*
对packets_array赋值,构造长度为400000的链表
最后释放内存
*/
for(i=0;i!=400000;i++)
{
for(p=packets_array[i];p!=NULL;)
{
q = p;
p = p->next;
free(q->data);
free(q);
}
}
free(packets_array);


请问最后释放内存部分有什么问题么?因为通过top命令发现内存并未释放掉。谢谢。

|
Packet **packets_array;

packets_array = (Packet **) malloc(400000 * sizeof(Packet*));  

// 这里是申请400000万个 Packet* 指针地址?? sizeof(Packet*) == 4字节



不知道我的理解对否?

另外,你打算一次申请400000个数据块,用400000次来释放这些内存,
我没有这样用过,我也不知道这样是否可行,但至少我觉得这样做是不合理的。

既然是用链表,为什么要一次申请400000个节点的内存空间呢,为什么不每次添加节点的时候再申请内存,

然后用你后面的释放内存方式来释放内存。

|
    for(i=0;i!=400000;i++)
    {
        for(p=packets_array[i];p!=NULL;)
        {
            q = p;
            p = p->next;
            free(q->data);
            free(q);
        }
        free(packets_array[i]);    //add this 

    }
  //   free(packets_array);   delete this

|
楼主看的是top中显示的哪一列呢,好像top命令只能看到栈空间的大小,堆空间的看不到
而malloc申请的内存是在堆空间的

|
typedef struct node
{
    struct pcap_pkthdr header;
    u_int8_t* data;
    u_int32_t data_len;
    struct node *next;
}Packet;
Packet **packets_array;
packets_array = (Packet **) malloc(400000 * sizeof(Packet*));
    memset(packets_array, NULL, sizeof(Packet**) * 400000);

packets_array是2维指针,你还没给它指向的400000个Packet*指针分配地址啊,还有每个Packet*指针指向的->data也没分配啊

|
经验证,这段代码没有问题

|
楼主说到要操作链表,我也有点感想,其实链表,我们用的都是动态的链表,不要一次性就分配那么多内存空间给它,在你想要插入节点到链表上的时候再申请就可以了,这样到最后不想用链表的时候一起释放就可以了
不知道我的理解对你帮助吗

    
 
 

您可能感兴趣的文章:

  • 请教高手如何释放内存
  • 请教高手:FreeBSD下什么命令能释放系统的端口
  • 请教:apr_palloc申请内存后如何释放?
  • 请教:不靠库函数来分配和释放内存,JAVA可以自动的对内存进行管理。能详细说明吗?
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • 请教!Linux系统C开发的程序,为什么我的程序运行时内存持续增长,程序退出后内存也没有降低?
  • 请教redhat9上如何进行内存整理
  • 请教Linux内存分配策略与Windows有何异同?
  • 请教一个内存方面的问题
  • 请教几个虚拟内存的问题!谢谢
  • 请教一个AIX下内存分配的问题
  • 请教: gdb中能否打印内存中某个位(或某些位)的值???
  • 请教多线程程序的内存占用问题
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢 iis7站长之家
  • 请教,在linux下如何判断程序的内存泄露?
  • 请教高手,一个关于共享内存的问题。
  • 菜鸟请教有关共享内存管理的一个问题
  • 请教:linux下如何检测并控制进程的内存大小?
  • 请教:IBM AIX 4.3下面如何获得系统当前的物理内存占用率啊?
  • 请教关于red hat linux系统内存消耗接近100%的原因?
  • 请教查看某个特定进程内存消耗情况的命令,急!
  • 请教一个定时获取cpu、内存占用率
  • linux 共享内存 请教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3