CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

delete []释放内存问题

楼主yu_xm(谁送我分)2006-12-07 23:06:17 在 C/C++ / C++ 语言 提问

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

相关问题

关键词

得分解答快速导航

  • 帖主:yu_xm
  • ugg
  • guochun
  • jiangsheng
  • kenneth_lueng
  • v2002750
  • lngf
  • A_snail
  • haoranisme

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo