以下是引用有容就大在2012-1-21 11:13:05的发言:
谢谢你的讲解,我上面的程序是把循环链表逐个删除留下最后一个,那么每删除一个就应当释放一个申请的内存,如何做到删一个释放一个呢?
还有你说 free(p1);是p1指向的内存地址 并不是释放指针. 那么释放一个链表的头指针指向的内存地址是不是就能释放整个链表占据的内存?
谢谢你的讲解,我上面的程序是把循环链表逐个删除留下最后一个,那么每删除一个就应当释放一个申请的内存,如何做到删一个释放一个呢?
还有你说 free(p1);是p1指向的内存地址 并不是释放指针. 那么释放一个链表的头指针指向的内存地址是不是就能释放整个链表占据的内存?
从你问的问题可以看出来,你还真没有明白链表。。
比喻说
pMOLI 一个结构体的指针
tagMOLI 一个结构。
这里随便假设
Typedef struct tagMOLI
{
int x;//就含一个整数型的变量
struct tagMOLI *pTrNext;//一个简单指向下一个节点的结构指针
}*pMOLI,MOLI;
你MOLI p=(MOLI *)malloc(sizeof(tagMOLI))的内存是吧。
。
一般来说链表都会声明一个全局表结构变量head;
这里可以用很多方式。我就随便用一种.
MOLI head;//有很多方式。 你自己决定,我用我认为简单.
head.pTrNext 这个指向第二个节点指针.然后一个一个连下去 像串羊肉串一样的。
头节点和别的简单都差不多。就一个MOLI结构体。
每个节点就是一个结构体,用里面的成员变量指针联系起来。
所以 你是释放free(&head);
你只是释放head 这个结构内存 。
其他节点是你用malloc申请的内存,这些内存在逻辑上和头结点连起来的。
但实际上物理的内存地址是分开的,是任意分配的内存。
所以如果你你其他的内存没有释放 而释放头指针。
其他的节点就不能得到他们的内存地址。因为我们是通过头节点联系起别的节点的 这个你应该知道。
你这样就出现了内存泄露。这样的程序就想定时器诈弹一样一样的,随时可能爆炸。。
我以前觉得没有什么,现在有点感受到这点的可怕。内存这块确实非常重要,程序出现问题而在这块。很容易出现程序出现异常。
这样很危险的。
内存确实注意释放 虽然现在的内存比以前大多了,但我们知道 我们运行的程序也相应多了,而且可能很在内存。
这几天我用会声会影 制作视频的时候 2G的内存占到%80多了,有时候程序就异常关闭了 这样是相当恐怖的。
可能又要等30 40 分钟。。。
所以我们要注重内存这块 虽然现在我们写的程序比较小,但要时候我们写大程序的时候呢。。
这些是我不仅说给你听 也是说给我自己听的。。
没有别的意思 简单的简单交流自己的观点,希望你不要介意
用心做一件事情就这么简单