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

来源:互联网 发布:淘宝开放平台有什么用 编辑:程序博客网 时间:2024/04/29 17:33

 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 0