指针可以安全地和可移植地用作对象ID吗?

Are*_* Fu 8 c++ pointers

假设我有一堆有关类实例的有效指针A.我能安全且可移植地假设指针在整个对象生命周期内保持不变吗?换句话说,我可以使用指向对象的指针作为唯一对象ID吗?

Lig*_*ica 8

当然; 我不明白为什么不.

内存地址几乎就是对象标识的定义(暂时取出等式中的类型).

  • @David:如果您将`Derived`视为`Base`,则该对象可能具有不同的地址.对于类型指针比较而言,这并不重要.但是如果你有一个由`void*`指针组成的数据库,你可能会得到漏报. (2认同)
  • 向上和向下转换不会产生指向同一对象的指针,而是指向给定类型的子对象(或超级对象,如果这是一个合适的术语).关系地址 - 对象是唯一的**总是**. (2认同)

bor*_*ble 5

不一定 - 这取决于您如何分配这些实例以及随后对它们执行的操作.例如,假设您创建了一个对象数组,然后重新分配该数组.现在无法保证对象仍将驻留在同一位置.

  • 那些不是同一个对象,它们是复制或移动. (3认同)

And*_*ndy 5

只有在确定删除对象后不会创建任何对象时,才能执行此操作。新对象可以在先前删除的对象的相同地址处创建,这可能是一个问题:您不希望两个不同的对象具有相同的 ID。


dor*_*ron 5

虽然内存地址唯一标识一个对象通常是正确的。有两个重要的警告:

  1. 当一个对象被删除时,地址可能会被重用(很可能是同一类的对象)。

  2. 如果您使用不同的进程,则两个进程中的地址很可能相同。