windows C++ new/delete内存大小

转载自:https://blog.csdn.net/will_hsbsch/article/details/21124055

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);

以上代码就是通过指针获取内存大小,具体多少字节。 Size存的是字节数
也可以进行估算,Size 4个字节, Flags 4个字节, union(Settable 4个字节, Tag 4个字节), 所以Size地址与new地址相差16个字节
实验例子:
1.
int *p = new int;
cout << *(p - 4) << endl; //4

 

2.
int *p = new int[4];
cout << *(p - 4) << endl; //16

3. 

char *p = new char[10];
cout << *(int*)(p - 16) << endl; //10

 4.

 我们把P向后移动一个位置或者向前,只要不是这块内存的第一个位置,然后我们delete[] p,会有什么后果?后果不可预测!!自己实验下,系统卡死,死循环
posted @ 2018-09-05 23:11  蓝天飞翔的白云  阅读(990)  评论(0编辑  收藏  举报