【问题标题】:Smart Pointer in C with reference loopsC 语言中的智能指针,带有参考循环
【发布时间】:2013-05-11 23:26:04
【问题描述】:

除了在 C 中执行此操作(现在回头为时已晚)之外,我还编写了几个支持 C 引用计数的结构和函数。基本上我已经实现了 C++ 风格的智能指针。不过,我的大问题是我在图形中使用这些(具有顶点和边的那种),并且在图形中使用了我的智能指针。因此,如果我有一个节点连接到连接到另一个节点的边缘,但我自己没有更多指向它们的指针,它们每个都保留一个指向彼此的指针。因此,指针计数不会达到 0,它们永远不会释放自己。有没有办法在不完全放弃指针计数的情况下解决这个问题?

【问题讨论】:

  • 这是一种让垃圾收集器感到兴奋的事情......或者,至少,这是他们必须相当小心处理的事情。您的问题与垃圾收集有关,但显然不一样。
  • 不,这几乎是我的问题。我正在尝试编写一种通过内存管理编译成 C 的编程语言。
  • 这个问题你解决了吗?我有类似的问题... :( stackoverflow.com/questions/19142499/…
  • @PauloTorrens 有点像?并不真地。从我对指针所做的所有研究中,我发现,用指针计数基本上不可能做到这一点,我必须为我分配的内存实现一种标记算法。

标签: c smart-pointers reference-counting


【解决方案1】:

您应该研究如何实现 boost::weak_ptr 以打破 shared_ptr 的循环。

【讨论】:

  • 我不确定这是否能解决我的问题。假设您有节点 a、b 和 c,以及堆栈引用 s。想象它们以 s->a->b->c 的形式相互指向,然后是 s->b 和 c->b。如果我们从 a 中删除 s,是否有任何可验证的方式(没有 BFS)来确定 s 仍然通过 b 指向它?此外,如果我们从 b 中删除 s,b 怎么知道现在应该删除它并且 s 既不指向 a 也不指向 c?
  • @Redian 听起来weak_ptr 可以解决您的问题。 weak_ptr 保留对shared_ptr 的引用,但在调用weak_ptr.lock() 之前您无法访问内容。如果shared_ptr 仍然有效,它将增加其引用计数。如果不是,则返回 null。主要的shared_ptr不受weak_ptrs的影响,在没有具体引用的情况下可以清理。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2015-01-24
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多