Windows 上C++ new/detele如何知道内存大小

 Windows 上,但使用C++语言new一块内存,用指针P指向这块内存,但我们调用delete的时候如何知道我们需要释放的空间大小,毕竟我们只给了一个P指针,并没有给出内存大小。

在Windows系统上,每当使用new/new[]申请到内存时,回调用系统的API在堆上开出一块我们需要大小的内存。例如:

int* p = new int[100];

此时申请成功时,P指向了这块内存的一个元素地址。同时,会在P的前面,记录我们申请的内存大小,这样当我们调用delete []p时,系统才知道我们具体申请的内存大小。

以下就是P指针地址前面存储我们申请内存信息的结构体:

//typedef struct _RTL_HEAP_ENTRY {
//      SIZE_T Size;
//      USHORT Flags;
//      USHORT AllocatorBackTraceIndex;
//      union {
//              struct {
//                      SIZE_T Settable;
//                      ULONG Tag;
//              } s1;
//              struct {
//                      SIZE_T CommittedSize;
//                      PVOID FirstBlock;
//              } s2;
//      } u;
//} RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY;
用下面代码查看具体的存储信息 
//   int *p = new int[100];
//   PRTL_HEAP_ENTRY pHeapEntry=(PRTL_HEAP_ENTRY(p)-1);
//   printf("i: %d, size: %d\n", i, pHeapEntry->Size);

以上代码就是通过指针获取内存大小,具体多少字节。

我们可以做个小实验:
1 我们把P向后移动一个位置或者向前,只要不是这块内存的第一个位置,然后我们delete[] p,会有什么后果?后果不可预测!!自己实验下,系统卡死,死循环





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值