【问题标题】:Find pointers from pointee从pointee中查找指针
【发布时间】:2010-05-14 05:35:05
【问题描述】:

从此代码:

int x = 5;
int other = 10;
vector<int*> v_ptr; 
v_ptr.push_back(&x);
v_ptr.push_back(&other);
v_ptr.push_back(&x);

有没有我可以从x 变量本身知道谁指向x,这样我就不必在v_ptr 中搜索x 的地址?这在 C++ 或 C++0x 中是否可行?

我读到,在进行垃圾收集时,他们会查看内存,看看是否有任何东西指向它,然后决定删除未使用的变量等。

【问题讨论】:

  • 垃圾收集器这样做的方式是扫描每个活动对象,并为每个对象记录它指向的其他对象。当他们对每个对象都这样做时,他们就可以准确地知道其他对象指向了哪些对象。但他们实际上是在暴力破解它。仅通过查看对象本身无法确定存在哪些指向对象的指针。

标签: c++ garbage-collection pointers


【解决方案1】:

没有。这就像问一个人是否认识所有知道他们地址的人。

【讨论】:

  • +1。您只知道一种情况:您永远不会将您的邮寄地址透露给任何人。
【解决方案2】:

不,如果不遍历分配给它的可能位置,你就无法知道什么对 x 有引用(v_ptr)

--或者--

如果你必须这样做,你可能想做一些参考跟踪(可用于垃圾收集),比如

v_ptr[0]=add_reference(&x,&v_ptr[0]);

其中 add_reference 是一些函数,具有对第一个参数的引用列表,引用者作为第二个参数(这对于 STL 类型可能很棘手)

【讨论】:

  • 不知道 add_reference 但我想你从回复中给了我另一个想法非常感谢:)
【解决方案3】:

不,不可能知道谁指向 x。

此外,C++ 不会被垃圾回收。

即使您使用指向 x 的 shared_pointer,您也可以找出指向 x 的指针数量,但不知道它们是谁。

【讨论】:

  • 我认为关于垃圾收集的评论是关于寻找指向 x 的引用的概念,而不是说 C++ 有垃圾收集。
【解决方案4】:

不,用原始指针不可能知道这一点。

某些类型的“智能指针”(实际上是包含指针和其他关于指针的元数据的对象)作为其元数据的一部分保留一个列表或计数来自其他对象的指向对象的所有引用智能指针。在垃圾回收语言中,此机制用于确定对象是否不再被引用,但它不是标准 C 或 C++ 指针的特征。

【讨论】:

    【解决方案5】:

    除了此处的其他准确答案外,请注意,在垃圾收集语言(我猜是 C++.NET 或任何其他普通语言,Java/C# 等)中,垃圾收集的一种技术是遍历引用, 标记指向的所有内容。

    但请注意,这实际上是另一个方向。我从一组已知的对象开始,并跟踪它们与其他对象的所有链接等。我通常永远不会说“给定这个对象,让我计算谁指向它或持有对它的引用”。

    【讨论】:

      【解决方案6】:

      您的实际问题的答案是否定的,C++ 没有一种机制来确定有多少引用仍然处于活动状态。尽管如此,虽然 C++ 不是垃圾收集,但如果您有兴趣,可以尝试其中一个 gc_classes。这是一个 stackoverflow 帖子,其中列出了其中一些:Garbage collection Libraries in C++

      【讨论】:

        【解决方案7】:

        是的,您可以知道 - 在执行的给定点 - 是否有指向您的变量的指针。您需要做的就是跟踪分配给进程中每个变量的内存。这意味着知道堆栈和堆的开始和结束地址。然后,您可以在这些地址范围内对变量的位置进行简单的顺序搜索。

        虽然迭代那些相对较小的内存部分应该不会花费很长时间,但您可以通过维护仅跟踪引用的结构来优化搜索时间,但代价是一些额外的内存开销和指针创建开销。这为您提供了一个较小的搜索列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 2014-11-10
          • 1970-01-01
          • 2014-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多