首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于new,delete【】的有关问题

2012-02-24 
关于new,delete【】的问题请教delete【】去哪里查找new出来空间的维数???即int *p new int【10】delete [] p

关于new,delete【】的问题
请教delete【】去哪里查找new出来空间的维数???


int *p = new int【10】;
delete [] p;
如果知道删除10个int,这个“10”存放在哪里???


[解决办法]
简单的来说,在new int[10]的时候,内存实际分配的空间要大于10的,多余的内存就是用来存放大小等特殊信息的;

在delete的时候,系统会根据p然后移动10个单位,指向那快包含特殊信息的内存,然后可以取得大小了。

所以如果删除的时候p不是首地址,而是p++,这时候就是很危险的操作了,切忌。
[解决办法]
虽然我不知道new这个运算符到底是怎么工作的,但我知道new的时候肯定是申请一段连续的空间,可能会在最后作个标记之类的,不过不一定是其大小,就像'\0'是字符串结束的标记,DELETE运算符执行的时候,遇到这个标记就结束释放工作,就像输出字符串一样,遇到'\0'就结束,只是个人想法,可能与本人说的有些出入吧
[解决办法]
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 
new表达式分配的对象就在堆里
具体的大小会在堆的头部用一个字节存放堆的大小
所以delete的时候编译就知道该释放多少

[解决办法]
对于动态内存的管理,现在的编译器基本上按照下面两种方法来管理的,第一种是使用表格来记录和管理动态的内存的分配,每次都记录申请返回的首地址以及大小,在释放的时候通过查表来实现管理。还有一种就是在每次分配的内存的前面添加一些字节来存储其分配的大小,vc使用的是后者方式,在new返回地址的前16个字节开始的4个字节中存储的就是该动态内存的大小。
可以这样得到
对于任意的一个指针 * p(必须是new返回的地址,而不能是已经后移过的指针);
*(int *)((char *)p - 16),这样就可以得到了。

热点排行