标题:[求助]关于free函数
只看楼主
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 
我觉得 穆扬 说得非常好!比喻形象!论证也不错!赞一个!

至于 baidu 那个问题,我觉得思考一下应该没问题了。

穆扬这句“free只要通知系统这一块内存中的任意一个地址信息量已经绝对充分”我觉得没有错!
比如说,申请了一块内存空间,然后逐个给指向这块内存的指针赋值,指针是
不断移动,随便移动到哪里你都可以停下来不再赋值了。现在就是相当于:指针指向申请的那块内存哪个地方都有可能,但是你可以随时释放掉这块堆里的内存,并不是一定要把指针强制指向这块内存中的哪个地方才可以释放!

道理就是这样!以上个人见解!不对的地方请大家拍砖!

我的原则很简单:不做不喜欢的事!
2006-08-04 12:39
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-04 12:57
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
以下是引用lj_860603在2006-8-4 12:39:42的发言:
我觉得 穆扬 说得非常好!比喻形象!论证也不错!赞一个!

至于 baidu 那个问题,我觉得思考一下应该没问题了。

穆扬这句“free只要通知系统这一块内存中的任意一个地址信息量已经绝对充分”我觉得没有错!
比如说,申请了一块内存空间,然后逐个给指向这块内存的指针赋值,指针是
不断移动,随便移动到哪里你都可以停下来不再赋值了。现在就是相当于:指针指向申请的那块内存哪个地方都有可能,但是你可以随时释放掉这块堆里的内存,并不是一定要把指针强制指向这块内存中的哪个地方才可以释放!

道理就是这样!以上个人见解!不对的地方请大家拍砖!

偶先拍!你对malloc机制了解不多

先让你看看一个free可能的或者基本的源程序,再想想,你是不是对
void free(void *ptr) {

struct mem_control_block *free;

free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-04 12:57
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-04 13:00
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-04 13:07
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 
原来是那样啊。baidu 拍得好啊!

只是为什么会有这句:free->is_available = 1; ??这句干啥的??

我的原则很简单:不做不喜欢的事!
2006-08-04 13:13
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
我们知道的是malloc函数分配内存并返回一个指针,比如
ptr1=(char *)malloc(80*sizeof(char));
ptr1指向一个80个字符的空间,但在这80个字符之前malloc函数还放置了一个struct mem_control_block 用来放置管理这80个字符大小的内存的参数。

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-04 13:22
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 

struct mem_control_block {

int is_available;

int size;

};


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-04 13:24
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
当然,偶说的只是理想化模式而已,实际上,各种系统的内存管理都有区别,也更复杂。

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-04 13:25
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
以下是引用穆扬在2006-8-4 12:57:24的发言:

有种人只懂"形而下学"(代码)
我不但懂"形而下学"
还懂"形而上学"

“一个民族想要站在科学的最高峰,就一刻也不能没有理论思维。”------恩格斯
《马克思恩格斯选集》第3卷,人民出版社1972年版,第467页。

#include<stdio.h>
#include<malloc.h>
int main()
{
char *ptr1,*ptr2;
ptr1=(char *)malloc(80*sizeof(char));
gets(ptr1);

ptr2=ptr1;
puts("0. ");
puts(ptr1);

ptr2++;
free(ptr2);
puts("1. ");
puts(ptr1);

ptr2--;
free(ptr2);
puts("2. ");
puts(ptr1);

}

自己去运行吧


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-04 13:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-81781-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.122617 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved