如何判斷一個C++物件是否在堆疊上
阿新 • • 發佈:2018-12-30
要解答這個問題,其實就是要知道的堆疊的起始地址, 而我們知道堆疊其實就是一段有相同屬性的記憶體頁面,而Windows也是有API讓我們查詢虛擬記憶體的頁面分配情況的。所有我們可以通過VirtualQuery這個API來獲取堆疊的起始地址,然後就可以得到答案了。
{
INT nStackValue(0);
MEMORY_BASIC_INFORMATION mi = {0};
DWORD dwRet = VirtualQuery(&nStackValue, &mi, sizeof(mi));
if(dwRet > 0)
{
return pObject >= mi.BaseAddress
&& (DWORD)pObject < (DWORD)mi.BaseAddress + mi.RegionSize;
}
return FALSE;
}
int g_value = 10;
int main(int argc, char* argv[])
{
int nStackValue = 1;
int* p = new int(10);
BOOL bStackValue = IsObjectOnStack(&g_value); //false
bStackValue = IsObjectOnStack(&nStackValue); //true
bStackValue = IsObjectOnStack(p); //false
system("pause");
return 0;
}
當然,我們知道每個執行緒都有自己的堆疊,所以上面的方法針對執行緒1查詢執行緒1的堆疊物件是可行的,執行緒2查詢執行緒2的堆疊物件頁是可行的,但是執行緒1查詢執行緒2的堆疊物件就不行了。所以多執行緒情況下,我們可以統計出所有的執行緒堆疊起始地址,然後統一判斷。當然隨著執行緒的建立和銷燬,堆疊本身也是在不斷變化的。
我想了下,不知道判斷物件是否在堆疊上在我們實際程式設計中有什麼用,誰知道的話麻煩提示下。
以上程式碼在Windows下測試通過,如果有不正確的地方,歡迎指正。