当前位置: 技术问答>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, ...
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个节点的内存空间呢,为什么不每次添加节点的时候再申请内存,
然后用你后面的释放内存方式来释放内存。
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
{
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申请的内存是在堆空间的
而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也没分配啊
{
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也没分配啊
|
经验证,这段代码没有问题
|
楼主说到要操作链表,我也有点感想,其实链表,我们用的都是动态的链表,不要一次性就分配那么多内存空间给它,在你想要插入节点到链表上的时候再申请就可以了,这样到最后不想用链表的时候一起释放就可以了
不知道我的理解对你帮助吗
不知道我的理解对你帮助吗