当 boost::shared_ptr 可能无法释放时?

发布于 2024-10-16 06:47:07 字数 168 浏览 4 评论 0原文

读完这个话题后 C++ 面试准备 (马特的回答)我有一个关于 boost::shared_ptr 的问题。 Shared_ptr 真的有可能泄漏内存吗?如何?

Afer reading this topic
C++ interview preparation
(Matt's answer) I've got a question about boost::shared_ptr. Is it really possible for shared_ptr to leak memory? How?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

生生漫 2024-10-23 06:47:07

shared_ptr 使用引用计数,这意味着循环引用可能会导致泄漏。具体来说:

struct A {
    shared_ptr<A> other;
};

shared_ptr<A> foo() {
    shared_ptr<A> one(new A);
    shared_ptr<A> two(new A);
    one->other = two;
    two->other = one;
    return one;
}

如果没有手动干预(将 other 指针设置为 NULL),foo 返回的数据结构永远不会被释放。

现在这只是每个程序员都应该知道的事实;更有趣的采访对话是如何应对。选项包括:

  • 重新设计数据结构,从而不再需要指针循环;
  • 在每个循环中将至少一个指针降级为非拥有引用(裸指针或 weak_ptr);
  • 专门的自行车收藏家
  • 作为最后的手段,在适当的点手动将指针清空(这会破坏异常安全)。

shared_ptr uses reference counts, and that means circular references can cause leaks. Concretely:

struct A {
    shared_ptr<A> other;
};

shared_ptr<A> foo() {
    shared_ptr<A> one(new A);
    shared_ptr<A> two(new A);
    one->other = two;
    two->other = one;
    return one;
}

the data structure returned by foo will never be deallocated without manual intervention (set either of the other pointers to NULL).

Now this is just a fact that every programmer should know; the more interesting interview conversation is what to do about it. Options include:

  • redesigning the data structure so pointer cycles are not necessary;
  • demoting at least one pointer in every cycle to a non-owning reference (a bare pointer or a weak_ptr);
  • a dedicated cycle collector;
  • as a last resort, manually NULLing out pointers at appropriate points (this breaks exception safety).
叹沉浮 2024-10-23 06:47:07

循环引用;引用计数垃圾收集器中的一个常见问题。

我建议您阅读以下内容: http://www.codeproject.com/KB/ stl/boostsmartptr.aspx#Cyclic 参考文献

Circular references; a common problem in reference counting garbage collectors.

I suggest you read the following: http://www.codeproject.com/KB/stl/boostsmartptr.aspx#Cyclic References

丶情人眼里出诗心の 2024-10-23 06:47:07

shared_ptr是一种引用计数机制。引用计数的一个问题是你可能会拥有一个没有其他人引用的循环引用链。除非有一种机制可以“打破锁链”,否则你的锁链永远不会被释放。

shared_ptr is a reference counting mechanism. One gotcha with ref counting is you can have a circular chain of references no one else refers to. You chain will never get freed unless there's a mechanism to 'break the chain'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文