在阅读了这个主题C++面试准备(马特的回答)之后,我对boost::shared_ptr有一个疑问。 shared_ptr是否真的可能会泄漏内存?如何?
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)的情况下被释放。
现在,这只是每个程序员都应该知道的一个事实;更有趣的面试谈话是要对此采取什么措施。可选方案包括:
循环引用:在引用计数垃圾收集器中常见的问题。
我建议您阅读以下内容:http://www.codeproject.com/KB/stl/boostsmartptr.aspx#Cyclic 引用
shared_ptr 是一个引用计数机制。其中一个问题是,您可能会有一条循环的引用链,没有其他人会引用它。除非有一种“打破链条”的机制,否则您的链条永远不会被释放。
new boost::shared_ptr<T>(new T()); // o noez!
- James McNellis{ boost::shared_ptr<T> sp(new T()); std::exit(0); } // o noez!
- James McNellisvoid f(std::shared_ptr<T>, int);
被调用为f(std::shared_ptr<T>(new T()), (throw 0, 0)); // 可能出错,也可能不出错
- James McNellis