C++中delete[]是如何知道数组大小的
先看一段代码:
int main(void)
{
int *pI = new int;
int *pArray = new int[10];
int size = *(pArray-1);
delete pI;
delete [] pArray; // delete是如何知道pArray数组大小的?
return 0;
}
看反编译后代码,没能直接找到答案,于是在网上搜索发现这样一篇文章:《Mismatching scalar and vector new and delete》。文章中说明了内存布局大概是这样:

这个结论肯定是正确的,但是我却没能在内存中找到这个记录数组大小的地址。再看反编译代码,例子中分别new了一个对象和一个数组,例子最后使用delete[]分别删除了这两个对象。从C++角度来说,第一个delete是scalar "delete",第二个delete [] 是vector "delete"。这两种delete调用应该不一样才对,但从反编译代码看,两处调用完全相同。
|
; int __cdecl main() _main proc near var_5C= dword ptr -5Ch var_58= dword ptr -58h p= dword ptr -54h var_50= dword ptr -50h size= dword ptr -0Ch push ebp mov ebp, esp sub esp, 5Ch push ebx push esi push edi push 4 ; size call j_??2@YAPAXI@Z ; operator new(uint) mov [ebp+var_5C], eax mov eax, [ebp+var_5C] mov [ebp+pI], eax nop push 28h ; size call j_??2@YAPAXI@Z ; operator new(uint) mov [ebp+var_58], eax mov eax, [ebp+var_58] mov [ebp+pArray], eax nop mov eax, [ebp+pArray] mov ecx, [eax-4] mov [ebp+size], ecx nop mov eax, [ebp+pI] mov [ebp+p], eax mov ecx, [ebp+p] push ecx ; p call j_??3@YAXPAX@Z ; operator delete(void *) nop mov eax, [ebp+pArray] mov [ebp+var_50], eax mov ecx, [ebp+var_50] push ecx ; p call j_??3@YAXPAX@Z ; operator delete(void *) xor eax, eax pop edi pop esi pop ebx mov esp, ebp pop ebp retn _main endp |
结论:
- 通过观察"new"调用了HeapAlloc函数,而这一函数使用可以将内存分配情况用结构体保存起来,"delete"估计就是通过这一结构体得到数组大小的。也就是说C++这一语法特点是借用了HeapAlloc等函数对Windows堆内存的管理方式实现的。
未知&待研究:
- scalar "new" 与 vector "delete []"出现不匹配的使用时究竟会不会出现问题
- 通过反编译验证结论。尤其是"delete []"

C++中delete[]是如何知道数组大小的的更多相关文章
- c++: 获取delete[]中的数组大小
看一个小例子: 1 #include <iostream> 2 3 using namespace std; 4 5 class A { 6 public: 7 A() { ...
- [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数
一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...
- (笔试题)数组A中任意两个相邻元素大小相差1,在其中查找某个数。
题目: 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路: 很明显,在数组中寻找 ...
- 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...
- delete 和 splice 删除数组中元素的区别
delete 和 splice 删除数组中元素的区别 ` var arr1 = ["a","b","c","d"]; d ...
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
- C/C++ 中长度为0的数组
参考文献:http://blog.csdn.net/zhaqiwen/article/details/7904515 近日在看项目中的框架代码时,发现了了一个奇特的语法:长度为0的数组例如 uint8 ...
- SQL中查看数据库各表的大小
SQL中查看数据库各表的大小 编写人:CC阿爸 2014-6-17 在日常SQL数据库的操作中,如何快速的查询数据库中各表中数据的大小. 以下有两种方法供参考: 第一种: create table # ...
随机推荐
- c#无损高质量压缩图片
这几天在做同城交友网www.niyuewo.com时遇到的一个问题,如何将会员的头像压缩,在网上搜索整理如下:在此也感谢医药精(www.yiyaojing.com)站长的帮忙 /// <summ ...
- C++ 二叉树遍历实现
原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...
- 关于Android使TextView可以滚动的设置
添加一行代码…… textView.setMovementMethod(ScrollingMovementMethod.getInstance());
- selenium 一个简单的流程
在整个自动化测试过程中需要分为及部分: 1.初始化 2.结束 3.异常处理 4.截图 5.对弹窗的处理 6.测试用例 整个过程中需要包括 ...
- java操作spark1.2.0
虽然推荐的是scala,但是还是试一下 package org.admln.java7OperateSpark; import java.util.Arrays; import java.util.L ...
- 【鬼脸原创】github搭建动态网站
a{ color:blue; font-weight:bold; } #cnblogs_post_body ol li { list-style-type: cjk-ideographic; } p[ ...
- uva 216 Getting in Line 最短路,全排列暴力做法
题目给出离散的点,要求求出一笔把所有点都连上的最短路径. 最多才8个点,果断用暴力求. 用next_permutation举出全排列,计算出路程,记录最短路径. 这题也可以用dfs回溯暴力,但是用最小 ...
- mina 粘包、多包和少包的解决方法
转载自:http://freemart.iteye.com/blog/836654 使用过 mina 的同学应该都遇到到过,在解码时少包.多包的问题,查阅了很多资料还是迷迷糊糊的,经过不懈努力,终于解 ...
- 仿jQuery中undelegate()方法功能的函数
//跨浏览器事件绑定 function addEvent(obj,type,fn){ if(typeof obj.removeEventListener !='undefined'){ /////// ...
- ionic中input框禁止输入问题
其实这个问题在之后沥青思路之后觉得还是挺好实现的,没有思路的时候真是找不到头绪~ 功能的描述为:当输入框中没有内容时,允许用户编辑:当其中有内容时不允许用户编辑,只有当用户点击编辑按钮后,才可允许编辑 ...