【探讨】C++ delete[] 是如何知道数组大小的

该问题值得探讨!


Lippman在对象模型里提到过一些(P257-P263),拍几张主要内容的图片





下面是自己的测试以及知乎的一些讨论和解答:


先贴自己的测试代码、反汇编以及内存转储图(测试环境:CodeBlocks、编译器GCC、系统64位)

【分别测试了数组大小为3和5的情况】





从内存转储可以看到,GCC其实并不是像网友说的那样,通过指针偏移、额外开辟8字节空间来存储长度。

具体是怎么做到的,目前我也不知道。有待探讨。




【下面贴出几个在知乎上看到的我觉得值得一看的回答】


“嗯,是这样的,内存管理库里总会有一个方法来记录你分配的内存是多大,你写的"在 p 地址之前有一个 n 记录这个数组的大小"是一种实现方法,管理库当然也可以自己维护一个列表,记录所有空间分配的位置和大小以及类型,delete的时候查一下这个列表就行了,也就是所谓"不是所有的编译器都是非这么实现不可",目前来说,常见的C++编译器也就是GCC/VCC/ICC/BCC等,具体实现可以查各编译器的文档说明,当然商业编译器不一定肯说.


作者:iux001
链接:https://www.zhihu.com/question/25556263/answer/31114361
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



作者:夏华林
链接:https://www.zhihu.com/question/25556263/answer/32589012
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

那就由我来给个详细的补充吧。
==========================
申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围
看下面这段代码:
#include<cstdio>
#include<iostream>
#include<malloc.h>
#include<assert.h>
#include<ctime>
using namespace std;

#define size 16

int main(void)
{
       
	void * p = NULL;
	srand(time(0));
	int a = 10;
	while (a--)
	{
       
		int n = rand() % 10000;
		p 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值