如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论

昨天有人在QQ群里问到如何判断一个C++对象是否在堆栈上, 我在网上搜索了下, 搜到这个么一个CSDN的帖子http://topic.csdn.net/t/20060124/10/4532966.html ,可惜它也没有给出一个合适的答案。

要解答这个问题,其实就是要知道的堆栈的起始地址, 而我们知道堆栈其实就是一段有相同属性的内存页面,而Windows也是有API让我们查询虚拟内存的页面分配情况的。所有我们可以通过VirtualQuery这个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;
}

当然,我们知道每个线程都有自己的堆栈,所以上面的方法针对线程1查询线程1的堆栈对象是可行的,线程2查询线程2的堆栈对象页是可行的,但是线程1查询线程2的堆栈对象就不行了。所以多线程情况下,我们可以统计出所有的线程堆栈起始地址,然后统一判断。当然随着线程的建立和销毁,堆栈本身也是在不断变化的。

我想了下,不知道判断对象是否在堆栈上在我们实际编程中有什么用,谁知道的话麻烦提示下。

以上代码在Windows下测试通过,如果有不正确的地方,欢迎指正。

http://www.cppblog.com/weiym/archive/2012/05/12/174634.html

时间: 2024-10-24 11:44:10

如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论的相关文章

如何判断一个C++对象是否在堆上(通过GetProcessHeaps取得所有堆,然后与对象地址比较即可),附许多精彩评论

在帖子如何判断一个C++对象是否在堆栈上 中, 又有人提出如何判断一个C++对象是否在堆上. 其实我们可以参照那个帖子的方法类似实现,我们知道堆就是Heap,在windows上我们可以通过GetProcessHeaps来得到所有的堆句柄,而我们这里只要知道Windows上的Heap Handle,其实就是堆的起始地址,就可以写如下代码了. #include <iostream>#include <windows.h> using namespace std; BOOL IsObje

如何判断一个js对象是否一个DOM对象

我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有DOM对象的各种属性或特征,比如是否有nodeType属性,有tagName属性,等等.判断的特征越多,也就越可靠,因为毕竟我们自定义的js对象也可以有那些属性.还有其他方法吗? 在DOM Level2标准中定义了一个HTMLElement对象,它规定所有的DOM对象都是HTMLElement的实例,

判断一个jquery对象是否为空

今天用jquery $获取一个jquery对象.$("#id") 然后用判断这个对象是否存在,id不存在的时候,判断这个是否存在, if($("#id")) 始终为真. 最后想到了用到javascript的写法. 1 var g=(typeof($("#id")[0])=="undefined")?0:1 javascript 数据类型转换 parseFloat 转成float 类型 parseInt 转成int类型

js判断一个 object 对象是否为空

方法一:使用for...in for...in... 遍历属性,为真则为“非空数组”:否则为“空数组” for (var i in obj) { return true  // 如果不为空,则会执行到这一步,返回true } return false // 如果为空,返回false 方法二:使用JSON.stringify() JSON 自带的 stringify() 方法,用于将 JavaScript 值转换为 JSON 字符串 if (JSON.stringify(data) === '{}

iOS判断一个View是否显示在屏幕上

有时候做UI的时候,比如需要判断scrollView中一个btn是否显示在屏幕上,可以用以下代码: #pragma mark - 返回一个View所在的位置x,y,是否在rect坐标里面 - (BOOL)isInScreenView:(UIView *)inView withRect:(CGRect)rect{ return CGRectIntersectsRect(inView.frame, rect); } #pragma mark - 返回判断screenRect所在的位置x,y,是否在r

判断一个js对象是不是数组

//今天突然想到一个问题,如何判断一个对象是不是数组 var arr = [0, 1, 2]; console.log(arr) //object, 显然不行 //查阅了很多资料,发现几个挺不错的方法 //方法一 function isArr(arr){ return Object.prototype.toString.call(arr) === '[object Array]'; } isArr(arr) //true //方法二 function isArray(arr){ return a

如何判断一个js对象是不是Array

1. instance of 2.constructor 3. isArray 1.var a=new Array(); a instanceof Array; //true 2.var a=new Array(); a.constructor==Array; //true 3.对支持isArray的浏览器 var a=new Array(); Array.isArray(a); //true 3.如果浏览器支持Array.isArray()可以直接判断否则需进行必要判断 /** * 判断一个对

如何判断一个js对象是否是数组

var a = [1,2,3]; 1.常规方法 a instanceof Array // true 2.通过constructor a.constructor == Array; //true 3.Jquery 使用的方法 toString.call(a); // 输出 "[object Array]"

js中如何判断一个DOM对象是否存在?

<div id="div1"></div> if(!!document.getElementById("div1"))