c语言动态分配存储期,计算机二级C语言辅导:malloc动态分配的内存的生存周期是多少?...

本文探讨了malloc分配内存时的特殊处理方式及其如何告知free释放的内存大小。此外,还对比了C++中new与delete操作符的行为,并通过实验验证了这些处理方式。

818ca582eb69acc211949733cb4feb30.png

malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放多少空间呢??比如:

int*pInt=(int*)malloc(10*sizeof(int));

…….;

free(p);

这里free是如何知道释放10个int大小的空间呢??既然free只需要一个参数—指针类型,那么这个地址(malloc返回的)一定作过什么特殊处理了.于是我问了一些网上的朋友,我得出以下一些结果:

char*p=malloc(size):

1. 实际分配一块size + 4大小的内存,char *p = 内存首地址。

2. *((int *)p) = size; //把大小放在分配内存的起始处。

3. return (void*)(p + 4); //返回除去存放大小以后的部分。

free(p); 1. char* q = (char *)p - 4;

2. int size = *((int *)q); //这里找到了size...

3. 通过操作系统释放内存或自己管理C/C++堆内存.

这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码:

int*p=new int[10];

delete []p;

一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题,为什么delete

能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚???答案:是.new所作的处理和上面的方法一样的,即:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的,我只试过vc6和bcc55编译器,它们都采用这个方法.不过,<>上只是说配置一个额外的word).为了验证这个说法,我写下了下面的代码进行测试.

2829f2ca24f0d0090cbba57f30759f23.png

计算机二级C语言辅导:malloc动态分配的内存的生存周期是多少?.doc

下载Word文档到电脑,方便收藏和打印[全文共752字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值