delete []释放内存问题
int *p = new int[100];
//...................
delete []p;
编译器怎么确定该释放空间的大小。
int *pp = (int*)malloc(sizeof(int)*100)
//..............
free(*pp);
free又是怎么确定该释放的空间大小的呢
问题点数:100、回复次数:26Top
1 楼ugg(逸学堂(exuetang.net))回复于 2006-12-07 23:15:03 得分 30
一般编译器都是在申请数组的地址前面多申请4个字节,记录申请数组的大小Top
2 楼abblly(西边日出东边雨)回复于 2006-12-07 23:16:32 得分 0
free(*pp);
-----
free(pp)吧Top
3 楼guochun(yingc)回复于 2006-12-07 23:17:55 得分 5
new的时候不是已经确定大小了
delete时自然释放相应大小
维护一张表就可以了Top
4 楼m00ners(M00N)回复于 2006-12-07 23:23:57 得分 0
MarkTop
5 楼yuanhan530(千年※ 蜗牛)回复于 2006-12-07 23:26:46 得分 0
上面有人说得对Top
6 楼lxhtzy(天之翼)回复于 2006-12-07 23:27:58 得分 0
mark'Top
7 楼lin_style(﹏.贾诩(某人语:矮子也高潮))回复于 2006-12-07 23:29:31 得分 0
100分。。MARK
Top
8 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-12-07 23:53:25 得分 10
比较常见的是两种方法
一种是分配额外的空间,在里面写上分配的长度
另外一种是用一个全局的内存管理器来映射已分配的内存和相关信息Top
9 楼kenneth_lueng()回复于 2006-12-08 08:07:04 得分 5
这好比银行存钱,银行不单放了你的¥,还会在给你的¥数目作一个记号
这样不就不会弄乱了吗,但它用什么方法记,就不用你来管了 ^0^Top
10 楼HappyTree(笨笨·天行健)回复于 2006-12-08 08:14:24 得分 0
同意一楼
在windows下可以使用_msize()来获得指针所分配内存的大小Top
11 楼jianshi051(看到我就给我一点分吧>_<~)回复于 2006-12-08 08:22:43 得分 0
一般编译器都是在申请数组的地址前面多申请4个字节,记录申请数组的大小
-----------------------------------------------------------------------
那岂不是只可以记录2的4次方,16个记录,太少了。
不明白,关注中……Top
12 楼zhangyisc(保尔)回复于 2006-12-08 08:33:19 得分 0
一个字节8位,2的8次方,4个为4个2的8次方的乘积。不知道理解对不?但也只有8KB。学习中。Top
13 楼v2002750(长安古道马迟迟)回复于 2006-12-08 08:38:34 得分 5
new操作分配的内存总是比你申请的内存要大那么一点点,因为要存放空间大小的信息,delete的时候会访问这个信息。Top
14 楼weixing979(★★★闪电侠★★★)回复于 2006-12-08 13:54:48 得分 0
编译器会帮你记着的Top
15 楼sclarkca810619(Clive)回复于 2006-12-08 14:04:57 得分 0
2^32次方是多少? 8kb?? 不好理解 ^o^Top
16 楼lngf(般若)回复于 2006-12-08 14:56:52 得分 20
你在使用new的时候,编译器不只是分配了100个int,在这之前还有一个叫cookie的东西,它占有4字节,当然不同的编译器是不一样的,记录的东西也不一样,不过它都记录了new所分配的内存大小,当你用delete的时候,是先去读这个cookie的
楼主可以用指针回退4字节读这处cookie值,可惜用MS和GNU编译是看不懂的,
BC能看到分配的内存大小Top
17 楼gapwind()回复于 2006-12-08 15:06:48 得分 0
RE1楼Top
18 楼zhanghelin(天空是蓝色的)回复于 2006-12-08 16:00:16 得分 0
支持 确实这样的用*(p-1)就可以看到系统分配内存的大小Top
19 楼A_snail(蜗)(牛)VS.(钉)(子)回复于 2006-12-08 16:51:27 得分 20
int *p = new int[100];
//...................
delete []p;
编译器怎么确定该释放空间的大小。
int *pp = (int*)malloc(sizeof(int)*100)
//..............
free(*pp); //!这地方应该是:free pp;
free又是怎么确定该释放的空间大小的呢
=============================================================================
使用new分配空间时,其实有三个步骤:
1.调用::operator new()分配一个传入大小的空间;
2.通过static_cast<class_type>()来转换分配空间所用的数据类型;
3.调用class的构造函数,初始化这块空间;
此时做第1步的时候就是调用malloc()来分配空间的;
malloc()分配空间时,实际大小比所看到的要大,有个用于记录分配空间大小的空间就是cookie,一般指针地址都是紧随其后,不同的编译器,cookie的大小也不尽相同...Top
20 楼VCFansKing(VCFans)回复于 2006-12-08 17:57:47 得分 0
看看操作系统中的内存分配部分比较好Top
21 楼eqxu(天使联盟)回复于 2006-12-08 18:42:11 得分 0
在嵌入式当中就不用new、多用数组其中一个目的就是为了减少系统的负载Top
22 楼haoranisme(肚肚狼)回复于 2006-12-08 18:46:10 得分 5
Windows System
HeapAlloc()和HeapFree()实现的。Top
23 楼david430(馒头)回复于 2006-12-08 19:41:47 得分 0
mark学习Top
24 楼johnhan2006(边城浪子)回复于 2006-12-08 21:58:18 得分 0
sfTop
25 楼lei001(太极)回复于 2006-12-08 22:12:27 得分 0
upTop
26 楼TANKTHT()回复于 2006-12-08 22:40:22 得分 0
new 关键字自动确定分配内存的大小 如: int *p = new int[100]; 就在内存中指定开辟4*100个字节大小的空间
delete 关键字更具new确定的大小去释放内存
---------------------------------------------------
在C语言中malloc要通过sizeof()函数来确定变量的大小 如:sizeof(int) 会计算出int变量需要4个字节的空间
int *pp = (int*)malloc(sizeof(int)*100)
//..............
free(*pp);
会更具malloc分配的空间释放内存Top




