换句话说,实现如何跟踪计数?

是否有一个类似地图的对象可以被所有的人访问 shared_ptr 实例的键是指针的地址,值是引用的数量?如果我必须实施一个 shared_ptr, ,这是我想到的第一个想法。

使用这些引用计数智能指针是否有可能发生内存泄漏?如果是这样,我该如何避免它们?

有帮助吗?

解决方案

我见过两种不同的非侵入式方法:

  1. 智能指针分配了一小撮内存以包含参考计数器。每个副本的 然后,智能指针会收到一个 指向实际对象的指针和 指向引用计数的指针。
  2. 除了对象指针之外, 每个智能指针都包含一个 上一个和下一个指针,从而 形成一个双向链表 指向特定 对象。引用计数为 隐式在列表中。当智能 指针被复制,它会将自身添加到 列表。销毁后,每个 智能指针将自身从 列表。如果是最后一个 然后,它释放的列表 引用的对象。

如果你走的话 这里 滚动到底部,有一个很好的图表,它更清楚地解释了这些方法。

其他提示

创建具有引用计数智能指针内存泄漏是很容易的。只需创建一个具有图中的一个周期对象的任何曲线状结构。在周期的对象将阻止对方被释放。这不能自动解决 - 例如,当您创建一个双链接列表,你必须采取在同一时间从不删除多个对象护理

每个智能指针对象包含一个共享的引用计数。 - 一个用于每原始指针

您可以看看文章。这种实现方式,其中围绕复制一个单独的对象存储这些。你也可以看看提升的文档或看一看的上智能指针维基百科文章

没有。 shared_ptr的只是不断的引用计数一个额外的指针。

当你做的shared_ptr对象进行复制其复制指针与引用的次数,增加它,和包含的对象上复制指针。

据我记得,有引用计数指针的有效C ++的一章处理的问题。

在原则上,你必须“光”指针类,含有一个指向类保持它知道递增/递减参考并破坏指针对象的引用。该参考计数类指向的对象被引用。

许多答案解决的引用计数被存储(它被存储在用于持有相同的本机指针所有的shared_ptr共享存储器)的方式,但最躲避泄漏的问题。

参考计数指针泄漏存储器的最简单的方式是创建循环。作为一个示例,其中所有的指针shared_ptr的至少两个元素的双向链表不能保证被删除。即使外部指针被释放,内部指针将仍然计数,和参考计数不会达到0。即,是至少与最天真实现。

到循环问题最简单的解决方案是混合与弱指针的shared_ptr(参考计数指针)不共享对象的所有权。

共享指针将共享两个资源(指针)和附加信息REFERENCE_COUNT。当你使用弱指针,引用计数翻倍:有一个共享的指针引用计数和弱指针引用计数。每当共享指针计数达到0时,资源被释放,但直到最后弱指针被释放REFERENCE_COUNT信息被留下活着。

在双链表中,外部参考在一个shared_ptr保持,而内部链接只是的weak_ptr。只要没有外部引用(shared_ptr的)列表的元素被释放,删除弱引用。在结束所有弱引用已被删除,最后弱指针到每个资源释放的REFERENCE_COUNT信息。

这是比上面的文字似乎不太混乱......我以后会再试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top