其實(shí)我們可以參照那個(gè)帖子的方法類(lèi)似實(shí)現(xiàn),我們知道堆就是Heap,在windows上我們可以通過(guò)GetProcessHeaps來(lái)得到所有的堆句柄,而我們這里只要知道Windows上的Heap Handle,其實(shí)就是堆的起始地址,就可以寫(xiě)如下代碼了。
#include <iostream>
#include <windows.h>
using namespace std;
BOOL IsObjectOnHeap(LPVOID pObject)
{
BOOL bRet(FALSE);
DWORD dwHeaps = GetProcessHeaps(0, NULL);
LPHANDLE pHeaps = new HANDLE[dwHeaps];
if(pHeaps != NULL)
{
MEMORY_BASIC_INFORMATION mi = {0};
GetProcessHeaps(dwHeaps, pHeaps);
for(INT i=0; i<dwHeaps; ++i)
{
VirtualQuery((LPVOID)pHeaps[i], &mi, sizeof(mi));
if(pObject >= mi.BaseAddress
&& (DWORD)pObject < (DWORD)mi.BaseAddress + mi.RegionSize)
{
bRet = TRUE;
break;
}
}
}
delete []pHeaps;
return bRet;
}
int g_value = 10;
int main(int argc, char* argv[])
{
int nStackValue = 1;
int* pNew = new int(10);
int* pNewArray = new int[100];
static int static_value = 0;
cout << "g_value:" << IsObjectOnHeap(&g_value) << endl; //false
cout << "nStackValue:" << IsObjectOnHeap(&nStackValue) << endl; //false
cout << "static_value:" << IsObjectOnHeap(&static_value) << endl; //false
cout << "pNew:" << IsObjectOnHeap(pNew) << endl; //true
cout << "pNewArray:" << IsObjectOnHeap(pNewArray) << endl; //true
system("pause");
return 0;
}
#include <windows.h>
using namespace std;
BOOL IsObjectOnHeap(LPVOID pObject)
{
BOOL bRet(FALSE);
DWORD dwHeaps = GetProcessHeaps(0, NULL);
LPHANDLE pHeaps = new HANDLE[dwHeaps];
if(pHeaps != NULL)
{
MEMORY_BASIC_INFORMATION mi = {0};
GetProcessHeaps(dwHeaps, pHeaps);
for(INT i=0; i<dwHeaps; ++i)
{
VirtualQuery((LPVOID)pHeaps[i], &mi, sizeof(mi));
if(pObject >= mi.BaseAddress
&& (DWORD)pObject < (DWORD)mi.BaseAddress + mi.RegionSize)
{
bRet = TRUE;
break;
}
}
}
delete []pHeaps;
return bRet;
}
int g_value = 10;
int main(int argc, char* argv[])
{
int nStackValue = 1;
int* pNew = new int(10);
int* pNewArray = new int[100];
static int static_value = 0;
cout << "g_value:" << IsObjectOnHeap(&g_value) << endl; //false
cout << "nStackValue:" << IsObjectOnHeap(&nStackValue) << endl; //false
cout << "static_value:" << IsObjectOnHeap(&static_value) << endl; //false
cout << "pNew:" << IsObjectOnHeap(pNew) << endl; //true
cout << "pNewArray:" << IsObjectOnHeap(pNewArray) << endl; //true
system("pause");
return 0;
}
以上代碼在Windows下測(cè)試通過(guò)(也只能在Windows上跑),如果有不正確的地方,歡迎指正。
注: 上面關(guān)于對(duì)象是否在堆上的判斷應(yīng)該是不對(duì),因?yàn)槎褍?nèi)存不是連續(xù)內(nèi)存,內(nèi)部是通過(guò)類(lèi)似鏈表的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,<<軟件調(diào)試>>里有相關(guān)介紹,也可以通過(guò)WinDbg的 !address 命令查看內(nèi)存分布
注: 上面關(guān)于對(duì)象是否在堆上的判斷應(yīng)該是不對(duì),因?yàn)槎褍?nèi)存不是連續(xù)內(nèi)存,內(nèi)部是通過(guò)類(lèi)似鏈表的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,<<軟件調(diào)試>>里有相關(guān)介紹,也可以通過(guò)WinDbg的 !address 命令查看內(nèi)存分布