• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            昨天有人在QQ群里問到如何判斷一個(gè)C++對(duì)象是否在堆棧上, 我在網(wǎng)上搜索了下, 搜到這個(gè)么一個(gè)CSDN的帖子http://topic.csdn.net/t/20060124/10/4532966.html ,可惜它也沒有給出一個(gè)合適的答案。

            要解答這個(gè)問題,其實(shí)就是要知道的堆棧的起始地址, 而我們知道堆棧其實(shí)就是一段有相同屬性的內(nèi)存頁(yè)面,而Windows也是有API讓我們查詢虛擬內(nèi)存的頁(yè)面分配情況的。所有我們可以通過VirtualQuery這個(gè)API來獲取堆棧的起始地址,然后就可以得到答案了。

            BOOL IsObjectOnStack(LPVOID pObject)
            {
                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;
            }

            當(dāng)然,我們知道每個(gè)線程都有自己的堆棧,所以上面的方法針對(duì)線程1查詢線程1的堆棧對(duì)象是可行的,線程2查詢線程2的堆棧對(duì)象頁(yè)是可行的,但是線程1查詢線程2的堆棧對(duì)象就不行了。所以多線程情況下,我們可以統(tǒng)計(jì)出所有的線程堆棧起始地址,然后統(tǒng)一判斷。當(dāng)然隨著線程的建立和銷毀,堆棧本身也是在不斷變化的。

            我想了下,不知道判斷對(duì)象是否在堆棧上在我們實(shí)際編程中有什么用,誰(shuí)知道的話麻煩提示下。

            以上代碼在Windows下測(cè)試通過,如果有不正確的地方,歡迎指正。
            posted on 2012-05-12 10:57 Richard Wei 閱讀(5674) 評(píng)論(9)  編輯 收藏 引用 所屬分類: C++

            FeedBack:
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-12 12:32 | 溪流
            學(xué)習(xí)了  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-12 13:57 | learner
            摟主,怎么判斷是不是堆對(duì)象?  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上[未登錄]
            2012-05-12 21:06 | jk
            不需要windows api也可以做到  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-12 22:33 | Duwen
            樓主您好,因?yàn)檫@個(gè)錯(cuò)誤不小,所以我還是覺得應(yīng)該指出,只為共同學(xué)習(xí)
            "我們知道每個(gè)線程都有自己的堆棧,所以上面的方法針對(duì)線程1查詢線程1的堆棧對(duì)象是可行的,線程2查詢線程2的堆棧對(duì)象頁(yè)是可行的,但是線程1查詢線程2的堆棧對(duì)象就不行了"
            這句話錯(cuò)了,系統(tǒng)在在為每個(gè)進(jìn)程初始化時(shí)創(chuàng)建一個(gè)默認(rèn)堆,它是全局的,該進(jìn)程中的所有線程共用這個(gè)全局堆,而系統(tǒng)會(huì)為每個(gè)線程創(chuàng)建一個(gè)棧,也就是說,如果沒有自己手動(dòng)創(chuàng)建堆(HeapCreate),那么一個(gè)進(jìn)程只有一個(gè)堆,而棧是線程相關(guān)的.我想樓主本意是想說棧,而"堆棧"這個(gè)詞用的多了,就疏忽了  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-12 22:48 | Richard Wei
            @Duwen
            多謝指正,希望共同進(jìn)步。

            恩,可能表達(dá)不是很清楚,我上面說的堆棧其實(shí)指的就是棧(Stack)。

            至于堆(Heap), 每個(gè)進(jìn)程除了默認(rèn)堆,還有其他的, 比如C/C++ CRT就會(huì)創(chuàng)建自己的堆,我們每次new對(duì)象,默認(rèn)都是在該堆里進(jìn)行的。所以如果我們寫程序時(shí)每個(gè)模塊(DLL)用靜態(tài)方式鏈接CRT,在DLL內(nèi)new對(duì)象時(shí)都會(huì)在DLL自己的CRT堆上創(chuàng)建對(duì)象。

              回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-12 22:49 | Richard Wei
            @jk
            有什么方法, 希望可以學(xué)習(xí)下。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-15 22:06 | 泡菜
            C++的對(duì)象,是一個(gè)比較大的概念,幾乎包含所有東西。。。呵呵  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)C++對(duì)象是否在堆棧上
            2012-05-15 22:09 | 泡菜
            呵呵。。。線程也能建立在堆上面的。@Duwen
              回復(fù)  更多評(píng)論
              
            999久久久免费国产精品播放| 天天做夜夜做久久做狠狠| 少妇高潮惨叫久久久久久| 欧美一区二区久久精品| 久久久久久久久久久精品尤物| 无码人妻精品一区二区三区久久久| 精品国产91久久久久久久| 久久男人中文字幕资源站| 亚洲国产精品无码久久一区二区| 亚洲国产二区三区久久| 久久天天婷婷五月俺也去| 国产精品对白刺激久久久| 久久久久亚洲av毛片大| 久久精品国产亚洲AV无码偷窥 | 久久国产乱子伦精品免费午夜| 99久久婷婷国产综合精品草原| 久久亚洲精品无码aⅴ大香| 青青草国产精品久久久久| 97精品伊人久久久大香线蕉| 99久久精品免费观看国产| 亚洲AV无码久久精品色欲| 亚洲精品成人久久久| 青草影院天堂男人久久| 久久99精品久久久久久久久久| 久久婷婷色香五月综合激情 | 久久精品一本到99热免费| 久久99亚洲综合精品首页| 久久中文字幕一区二区| 伊人久久综合无码成人网| 久久久这里有精品| 青青久久精品国产免费看| 99久久国产综合精品网成人影院| 久久Av无码精品人妻系列| 亚洲精品午夜国产VA久久成人| 久久天天躁狠狠躁夜夜av浪潮 | 亚洲国产精品婷婷久久| 国产精品对白刺激久久久| 91精品国产色综合久久| 97久久国产亚洲精品超碰热| 久久精品中文騷妇女内射| 国产精品一区二区久久|