C++ 的重点在于内存所有权 - 即所有权语义。
动态分配内存的块的所有者有责任释放该内存。因此,问题实际上变成了谁拥有该内存。
在 C++ 中,指针类型所包含的原始指针的所有权是有文档记录的,因此在一个好的(我个人认为)C++ 程序中很少看到传递原始指针的情况(因为原始指针没有隐含的所有权,因此我们无法知道谁拥有该内存,因此如果不仔细阅读文档,则不能确定谁负责所有权)。
相反,在类中很少看到存储原始指针,每个原始指针都存储在其自己的智能指针包装器中。(注意: 如果你不拥有一个对象,就不应该存储它,因为你无法知道它何时将超出作用域并被销毁。)
因此,问题是:
- 人们遇到了哪种所有权语义?
- 使用哪些标准类来实现这些语义?
- 在什么情况下发现它们有用?
让我们对每个答案保留一种语义所有权,以便可以单独进行投票。
总结:
从概念上讲,智能指针很简单,一个天真的实现很容易。我看到过许多尝试实现的例子,但不可避免地会以某种对偶然使用和示例不明显的方式中断。因此,我建议始终使用经过良好测试的库中的智能指针,而不是自己编写。 std::auto_ptr
或 Boost 智能指针之一似乎涵盖了我的所有需求。
std::auto_ptr<T>
:
单个人拥有该对象。允许转移所有权。
用途:这允许您定义显示所有权转移的接口。
boost::scoped_ptr<T>
单个人拥有该对象。不允许转移所有权。
用途:用于显示所有权。对象将通过析构函数或显式重置销毁。
boost::shared_ptr<T>
(std::tr1::shared_ptr<T>
)
多重所有权。这是一个简单的引用计数指针。当引用计数为零时,对象将被销毁。
用法: 当一个对象可以有多个拥有者且其生命周期无法在编译时确定时使用。
boost::weak_ptr<T>
:
与shared_ptr<T>
一起使用,用于处理指针循环引用的情况。
用法: 用于防止循环引用导致对象仅由循环维持共享引用计数。