寻找指针的原点
Finding origin of Pointer
如果你有一个对象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的位置,需要做更多的工作并了解对象在内存中的布局。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 寻找指针的原点