windows C++ new/delete內存大小
阿新 • • 發佈:2018-09-06
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內存大小