| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 653 人关注过本帖
标题:关于free()使用问题
只看楼主 加入收藏
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
结帖率:86.67%
收藏
 问题点数:0 回复次数:7 
关于free()使用问题
int *p,a=5;
p=&a;
free(p);


关于free的使用我还不是很清楚,如果free(p)是删除p所指向的空间的内容的话,那么如何删除p指针的空间呢???是不是一般的都不会去删除p指针的空间的啊???
搜索更多相关主题的帖子: free 
2010-03-11 19:25
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
一般free与malloc是配套使用的,它们操作的空间是堆
int *p,a=5;
p=&a;
free(p);
------------这样使用是不正确的,那些变量不是malloc那一族函数申请出来的,它们要么存储在数据段(全局变量和静态变量),要么存储在栈上(局部变量),使用free会使程序崩溃的,栈上的变量不用我们自己释放,当函数返回时,它们会被自动释放(是相当于,实际上是被弹栈了),数据段上的也不用我们管。
像int *p这个变量存储在数据段或栈上,无论它是什么类型的,它只占用四个字节,而p=malloc(size)指向的空间是在堆上的,free(p)可以用,p本身就不用我们管了;
在使用多级指针时,才有可能需要我们释放指针自己的空间,并且也是在用到了malloc那一族函数时才会需要:
int **p=malloc(sizeof(int)*10)... p[i] = malloc(size);在使用完后,要先释放p[i]指向的空间(free(p[i])),再释放p指向的空间 free(p);p本身仍然不用我们管。
表达不是很清楚,你可以找找这方面的资料来看看
2010-03-11 21:07
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
原来是这样啊,用malloc分配的空间才用free释放啊,那如果用malloc分配的空间,到最后没有用free释放的话,程序结束之后会如何啊???
2010-03-11 21:39
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
程序结束之后都会被释放,但是在你的程序运行时,用malloc分配了很多空间且没有释放,会影响程序的运行速度,并且到了一定程度后,你就会申请不到内存了
2010-03-12 01:43
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
这样啊,那用malloc申请的空间哪里来的?这个可用的空间怎么知道是多大??(好奇,问下!)
2010-03-13 20:09
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
int MB = 0;
while(malloc(1<<20)) MB++;
printf("%d\n", MB);
2010-03-13 20:23
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
以下是引用ldg628在2010-3-13 20:23:14的发言:

int MB = 0;
while(malloc(1<<20)) MB++;
printf("%d\n", MB);
看得不是很懂,能够解释下吗?? 那个malloc在这里的用法?(我一般都是(int *)malloc(sizeof(int))这么用的,那个1<<20也不懂什么意思!
2010-03-14 10:16
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
你没学习过汇编和编译,所以你会有此疑问,一个完整的C程序,被编译器(具体说还有链接器)处理过,先生成*.s,然后*.o。当你查看*.s(gcc -S)时,你会发现程序是分段(至少十几种段,不过常用的有.text .data .bss .init .symtab .plt)的,而malloc所分的空间在堆栈区即在 .bss段中。

以上所说是基于Linux环境的ELF文件结构。至于Windows环境的PE结构,原理差不多,有兴趣,可看 Linker and Loader

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-03-14 10:25
快速回复:关于free()使用问题
数据加载中...
 
   



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

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