免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4553 | 回复: 4
打印 上一主题 下一主题

【原创】内存管理malloc和free解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-13 11:20 |只看该作者 |倒序浏览
一。malloc
1。需要动态分配空间,一般用malloc来申请。申请空间后,要对空间进行初始化,一般置空。
例:p=(unsigned char *)malloc(30);
2.申请以后,要对申请的空间进行判断是否为NULL
例:if(p==NULL) {}
3.还要对申请的空间初始化
例:memset( p, 0,sizeof(p));
二。free
1.对malloc的空间,要用对应的free来释放
例:free(p);
2.对释放的空间的地址要指向NULL,以避免产生“野指针”
例:p=NULL;
三。总结及注意
1.用到的空间是否越界
2.释放的空间和申请的空间是同一空间
这一点尤其要注意,在应用程序执行的过程中可能会使指向初始化的空间的指针指向别处,也就是指针移位,尤其对一些局部变量,当局部变量自动释放后,指针还在指向那块地址,并且用free去释放那块地址,这是很危险的,可能表现在下一次malloc时core dump;也有可能一个指针多次malloc,但只free一次,必然造成一定的内存泄漏。
3.必要的时候,可以把申请的空间和释放的空间地址打印出来以跟踪整个流程,%s打印内容,%d打地址
例:printf( "p=[%s],p=[%d]\n",p,p);
4.注意分清数组和指针的分配方式,生存期。如要做内容的复制,分析下面两句:
例:char string1[10]="sss";
p=string1;
或p="www";
以上两句都使指针指向临时变量,虽然内容可以拷贝进去,但是这样free(p)时就会发生潜在的错误,直到程序运行起来才会发生不可预知的错误,最突出的是core dump。所以在代码编写的过程中一定要把这些杜绝,尤其是多次循环时,core dump的出现会让人头疼万分。

以上系个人心得,希望大家补充讨论!

论坛徽章:
0
2 [报告]
发表于 2003-03-13 12:41 |只看该作者

【原创】内存管理malloc和free解析

也有可能一个指针多次malloc,但只free一次,必然造成一定的内存泄漏。


要把指针当前的内存释放后才可以再次使用它指向新内存
而不是直接使用malloc

另外内存释放后把指针设置为NULL是一个好习惯

论坛徽章:
0
3 [报告]
发表于 2003-03-13 19:32 |只看该作者

【原创】内存管理malloc和free解析

3.还要对申请的空间初始化
例:memset( p, 0,sizeof(p));
memset只有sizeof(unsigned char)的长度吧?!

论坛徽章:
0
4 [报告]
发表于 2003-03-14 11:30 |只看该作者

【原创】内存管理malloc和free解析

我已经把指针这种观念淡化成数字了,特别是参数传递的时候,在用的时候再做类型转换.
       程序员在内存使用及申请方面应该严格控制. 我是尽可能避免(不是不用)使用malloc来分配内存,如果是申请得来的地址,在没有free之前是不会去改变这个地址指向.至于释放的问题,在哪申请就尽可能的在同一个调用级释放.

论坛徽章:
0
5 [报告]
发表于 2003-03-14 17:46 |只看该作者

【原创】内存管理malloc和free解析

原帖由 "ermiao" 发表:
";
例:memset( p, 0,sizeof(p));

似乎应该
memset(p, 0, 30);
毕竟你分配的是30嘛!
sizeof(p)返回的是指针的大小,即sizeof(void*)
而不是指针指向地方的大小。

原帖由 "ermiao" 发表:
";
%d打地址

似乎有一个%p可以直接用来打印地址。

原帖由 "ermiao" 发表:
";
例:char string1[10]="sss";
p=string1;
或p="www";

从操作上说这两段赋值是没有任何可以质疑的,
但是很明显不能使用free操作。后者更加严格,
例如:p="www";*p='3';
这种操作就会引起core dump。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP