Windows:指针unicity

时间:2011-09-16 07:45:02

标签: c++ windows qt

我需要在其中一个类中使用快速唯一ID来区分一个进程与另一个进程。我决定使用实例的地址来执行此操作。我最终得到了这样的结果(quintptr是一个Qt定义的整数类型,用于存储具有正确大小的地址,根据平台):

Foo::Foo()
: _id(reinterpret_cast<quintptr>(this))
{
 ...
}

这个想法是比较同一个exe的两个不同进程的输出。在Vista(我的开发机器)上没有问题。但是在XP上,_id的值在两个进程中是相同的(!)。

任何人都可以解释为什么会这样吗?如果使用这样的指针是个好主意(我想是的,我不再那么肯定了)?

感谢。

3 个答案:

答案 0 :(得分:7)

每个进程都有自己的地址空间。在XP上,它们都是一样的。因此,看到你所看到的内容是很常见的:两个具有相同地址但在两个不同地址空间中的对象。

事实证明,这会导致安全风险。攻击者能够猜出易受攻击的对象在内存中的位置,并利用它们。 Vista随机化地址空间(ASLR),这意味着两个进程更有可能将同一个对象放在不同的地址。

对于你的情况,使用这样的指针不是一个聪明的主意。只需使用进程ID

即可

答案 1 :(得分:3)

原因是每个进程都有自己的地址空间,如果两个进程相同,它们只使用相同的虚拟地址 - 甚至堆分配也可以在相同的虚拟地址完成。

您可以调用GetCurrentProcessId()一次并将结果存储在某处,以便进一步检索非常快。进程ID持续存在,并且在进程的生命周期内是唯一的。

答案 2 :(得分:1)

每个进程都有自己的地址空间。除非像ASLR之类的东西开始,否则源自相同可执行文件的两个进程的内存布局可能非常相似,如果不相同的话。

所以你的想法不是一个好主意。使用进程ID听起来像是一种更为理智的方法,但请记住,这些也可以回收利用。