什么时候可能没有释放boost :: shared_ptr?

时间:2011-02-09 05:08:55

标签: c++ boost memory-leaks shared-ptr

阅读本主题 C++ interview preparation (马特回答)我有一个关于boost :: shared_ptr的问题。 shared_ptr真的可能泄漏内存吗?怎么样?

3 个答案:

答案 0 :(得分:3)

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;
}

foo返回的数据结构永远不会在没有人工干预的情况下解除分配(将other指针设置为NULL)。

现在这只是每个程序员都应该知道的事实;更有趣的面试对话是怎么做的。选项包括:

  • 重新设计数据结构,因此不需要指针周期;
  • 将每个周期中至少一个指针降级为非拥有引用(裸指针或weak_ptr);
  • 专用的cycle collector;
  • 作为最后的手段,在适当的位置手动清空指针(这会破坏异常安全性)。

答案 1 :(得分:1)

循环参考;引用计数垃圾收集器的常见问题。

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

答案 2 :(得分:0)

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