寻找指针的原点

Finding origin of Pointer

本文关键字:原点 指针 寻找      更新时间:2023-10-16

如果你有一个对象t1和一个指向对象t2的指针,而我们目前在对象2中,那么我们可以从object2到object1吗?如何?

 (OBJECT1) --------> (OBJECT2)
                      we are here and we don't know where/what OBJECT1 is

No。假设您有几个指针指向OBJECT2

<>之前(POINTER1 ) ------------(POINTER2 ) -------------(point3) --------------> (object2)…-------------/(POINTERN ) ------------/之前

当你"向上"时,你应该指向哪个指针?

没有简单的方法可以做到这一点。您可以遍历整个地址空间,但在C

中没有"反向查找"。

不,您需要将父对象指针存储在对象2中。例如,Qt库经常这样做。

不行。您必须在object2中创建对object1的引用(双链表和单链表就是这种现象的一个例子)。

不能,标准的C/c++指针不能回溯。

实际上,您可以重载->操作符以在某处设置反向指针,但最好问问自己Object 2是否真的需要指向Object 1。如果是这样,存储一个从2到1的指针可能是最好的方法。

要做到这一点,并且能够跟踪多个引用,您可以在Object2的类中编写一个引用方法:

Class2 * Class2::getPointer(void * fromObject1) 
{
    ... add "from" to a table of Class2 that stores all the "Object 1"
}

这样做的一个限制是,没有什么可以阻止任意的Object 1存储一个指向Class2(一个"object 2")实例的指针,而不声明自己。

另一个限制是Class2知道"object 1"是void *。除非您定义了一个能够指向Class2并用它替换void *的类的层次结构,否则拥有void *的集合并不是很有价值:

Class2 * Class2::getPointer(Class1 * fromObject1) 
{
    ... add "from" to a table of Class2 that stores all the "Object 1"
}

但是在这里,只有Class1可以使用这个系统。

所以实际的问题是:Object 2需要和Object 1做什么?为什么要指向它呢?

一般来说:你不能。只有当你的对象存储了一个指向它的父/兄弟的指针(例如:双链表,一个有父链接的树),或者有一个"资源管理器"知道这些关系时,你才能这样做。

不,没有办法这样做。C和c++中的指针是单向的,并且没有可以搜索的指针的中心注册表(就像在关系数据库中那样)。

为了能够得到"返回",你必须实现逻辑,维护一个从OBJECT2到OBJECT1的向后指针,并在OBJECT2被另一个OBJECT1指向时更新它。当然,这只有在任何时候只有一个OBJECT1可以指向OBJECT2时才有效。

唯一的方法是对象2有一个指向对象1的指针。

另一方面,如果你在写一个垃圾收集器,你可以取对象2的地址,并在内存中查找该地址,你现在就知道object1指向object2的指针在哪里。这是保守垃圾收集器背后的基本思想。要找出对象1的位置,需要做更多的工作并了解对象在内存中的布局。