免费注册 查看新帖 |

Chinaunix

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

[C] 大侠来看.malloc 内存分配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-04 12:06 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char* p1 = (char*)malloc(10);
    memset(p1, 'a', 10);
    char* p2 = p1;
    p2 += 2;
    *p2 = 0;
    free(p1);
    printf("p2: %s\n", p2);
    printf("p1: %s\n", p1);
    return 0;
}

这时候free(p1), 好像只是free到'\0'(*p2 = 0前, 这后的内容, 也就是p2指向的还是存在的.
这是不是就内存泄露了么? 那怎么正确释放掉!!!

论坛徽章:
0
2 [报告]
发表于 2009-12-04 12:12 |只看该作者
内存是被正常free掉了,原有的内容还是在那里的

不存在内存泄露的问题

论坛徽章:
0
3 [报告]
发表于 2009-12-04 12:15 |只看该作者
原帖由 雨过白鹭洲 于 2009-12-4 12:12 发表
内存是被正常free掉了,原有的内容还是在那里的

不存在内存泄露的问题


不是啊, free 过后, p2前的内容全置空啦. p2后面的就还在.
搞不明白free是咋操作的.

论坛徽章:
0
4 [报告]
发表于 2009-12-04 12:54 |只看该作者
你认为你在p2那里加个\0就会影响到free释放内存?

论坛徽章:
0
5 [报告]
发表于 2009-12-04 13:18 |只看该作者
malloc多少就free多少。这个操作系统记着呢,错不了

论坛徽章:
0
6 [报告]
发表于 2009-12-04 13:27 |只看该作者
人被杀死之后,尸体还在,至少还存在杀人者的脑袋里面。

论坛徽章:
0
7 [报告]
发表于 2009-12-04 13:28 |只看该作者

行为不太确定,我free了,打印出来就是空了,有意思。。

论坛徽章:
0
8 [报告]
发表于 2009-12-04 13:52 |只看该作者

回复 #3 liuhengloveyou 的帖子

p2前的内容全置空, p2后面的就还在????

论坛徽章:
0
9 [报告]
发表于 2009-12-04 14:41 |只看该作者
原帖由 marksman201 于 2009-12-4 13:52 发表
p2前的内容全置空, p2后面的就还在????


是啊, 我开始是在LINUX下(GCC)测试的, 效果就是那样. free 把'\0'前的置空了, 后面的还有.
刚又在VC6里重做了一遍, 效果完全不一样. free后所有malloc来的内存都成不确定的内容了.

不知道啥意思了, 完全不一样. free 的标准定义应该是什么样的操作啊???

论坛徽章:
0
10 [报告]
发表于 2009-12-04 14:45 |只看该作者
lz了解一下malloc的原理吧,大致上在你malloc那段内存区域前有一小块内存保存着本次申请内存的信息,主要就是大小什么的,free时根据这个释放的,要是只释放0前的内存区域,岂不是任何malloc的内存,只要写入0值就泄露,那malloc还有意义了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP