1. 程式人生 > >windows C++ new/delete內存大小

windows C++ new/delete內存大小

get ret tab 估算 pre 實驗 trac 通過 pri

轉載自: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,會有什麽後果?後果不可預測!!自己實驗下,系統卡死,死循環

windows C++ new/delete內存大小