昨天有人在qq群裡問到如何判斷乙個c++物件是否在堆疊上, 我在網上搜尋了下, 搜到這個麼乙個csdn的帖子 ,可惜它也沒有給出乙個合適的答案。
要解答這個問題,其實就是要知道的堆疊的起始位址, 而我們知道堆疊其實就是一段有相同屬性的記憶體頁面,而windows也是有api讓我們查詢虛擬記憶體的頁面分配情況的。所有我們可以通過virtualquery這個api來獲取堆疊的起始位址,然後就可以得到答案了。
bool isobjectonstack(lpvoid pobject)
; dword dwret = virtualquery(&nstackvalue, &mi, sizeof(mi));
if(dwret > 0)
return false;
}int g_value = 10;
int main(int argc, char* ar**)
當然,我們知道每個執行緒都有自己的堆疊,所以上面的方法針對執行緒1查詢執行緒1的堆疊物件是可行的,執行緒2查詢執行緒2的堆疊物件頁是可行的,但是執行緒1查詢執行緒2的堆疊物件就不行了。所以多執行緒情況下,我們可以統計出所有的執行緒堆疊起始位址,然後統一判斷。當然隨著執行緒的建立和銷毀,堆疊本身也是在不斷變化的。
我想了下,不知道判斷物件是否在堆疊上在我們實際程式設計中有什麼用,誰知道的話麻煩提示下。
以上**在windows下測試通過,如果有不正確的地方,歡迎指正。
摘自 厚積薄發
如何判斷乙個物件是否死亡
每有乙個變數引用該物件時,引用計數器加1,當引用斷開時,計數器減1。優點 效率高 缺點 當兩個物件相互引用時,即使這兩個物件都沒有用了,還是不能夠被gc 建立乙個gc roots作為起始點,向下搜尋,搜尋所走過的路徑成為引用鏈,當物件沒有與任何引用鏈相連的話,則物件是可以被 的,否則不會被 gc r...
如何判斷乙個物件是否是可呼叫物件
基本上判斷python物件是否為可呼叫的函式,有三種方法 1 使用內建的callable函式 callable func 用於檢查物件是否可呼叫,返回true也可能呼叫失敗,但是返回false一定不可呼叫 2 判斷物件型別是否是functiontype type func is functionty...
如何判斷乙個JS物件是否為空
1 使用json把物件變為json字串,在判斷該字串的長度是否為2,或者該字串是否是 var obj1 var obj2 console.log json.stringify obj1 length 2 console.log json.stringify obj1 console.log json...