我需要在我的一个类(class)中使用一个快速的唯一 ID 来区分一个过程与另一个过程。我决定使用实例的地址来这样做。我最终得到了这样的结果(quintptr
是 Qt 定义的整数类型,用于根据平台存储具有正确大小的地址):
Foo::Foo()
: _id(reinterpret_cast<quintptr>(this))
{
...
}
想法是比较同一个exe的两个不同进程的输出。在 Vista(我的开发机器)上没有问题。但是在 XP 上,_id
的值在两个进程中是相同的(!)。
谁能解释一下这是为什么?如果使用这样的指针是个好主意(我认为是,我不再那么确定)?
谢谢。
最佳答案
每个进程都有自己的地址空间。在 XP 上,它们都是一样的。因此,您所看到的情况很常见:两个对象具有相同的地址,但位于两个不同的地址空间中。
事实证明,这会增加安全风险。攻击者能够猜测易受攻击的对象在内存中的位置,并利用它们。 Vista 随机化地址空间 (ASLR),这意味着两个进程更有可能将同一对象放在不同的地址。
对于您的情况,使用这样的指针不是一个好主意。只需使用进程 ID
关于c++ - Windows:指针唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441608/