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,会有什么后果?后果不可预测!!自己实验下,系统卡死,死循环