灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2677回复:0

[C++技术]如何判断一个C++对象是否在堆上

楼主#
更多 发布于:2012-09-06 11:34


在帖子如何判断一个C++对象是否在堆栈上 中, 又有人提出如何判断一个C++对象是否在堆上。
其实我们可以参照那个帖子的方法类似实现,我们知道堆就是Heap,在windows上我们可以通过GetProcessHeaps来得到所有的堆句柄,而我们这里只要知道Windows上的Heap Handle,其实就是堆的起始地址,就可以写如下代码了。
#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, ;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下测试通过(也只能在Windows上跑),如果有不正确的地方,欢迎指正。



喜欢0 评分0
游客

返回顶部