• <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)論
              
            国产免费久久精品99久久| 亚洲国产高清精品线久久| 99精品久久精品一区二区| 伊人久久五月天| 亚洲色婷婷综合久久| 久久久无码人妻精品无码| 久久综合久久综合久久综合| 色综合久久中文字幕综合网| 久久成人国产精品免费软件| 色综合久久久久无码专区| 激情伊人五月天久久综合| 国产精品免费久久久久电影网| 久久影视国产亚洲| 久久午夜无码鲁丝片| 93精91精品国产综合久久香蕉 | 一本一本久久aa综合精品| 久久久无码精品亚洲日韩蜜臀浪潮| 91久久九九无码成人网站| 精品久久久一二三区| 国产精自产拍久久久久久蜜| 日韩精品久久久久久免费| 欧美日韩成人精品久久久免费看| 99久久99久久久精品齐齐| 超级碰碰碰碰97久久久久| 四虎国产精品免费久久5151| 亚洲精品美女久久久久99| 亚洲欧美一级久久精品| 精品久久久久久久| 国内精品伊人久久久影院| 久久精品这里热有精品| 亚洲精品乱码久久久久久蜜桃图片| 久久精品国产亚洲网站| 无码人妻久久一区二区三区免费| 欧美亚洲国产精品久久| 久久久精品人妻无码专区不卡 | 亚洲欧美日韩久久精品| 久久精品国产清自在天天线| 色噜噜狠狠先锋影音久久| 久久亚洲高清观看| 久久93精品国产91久久综合| 久久亚洲高清观看|