C++ 是关于内存所有权的——也就是所有权语义。
一块动态分配的内存的所有者有责任释放该内存。所以问题真的变成了谁拥有记忆。
在 C++ 中,所有权由包装在内部的原始指针的类型记录,因此在一个好的(IMO)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>
在可能发生指针循环的情况下使用 with 。
用法:用于在只有循环维护共享引用计数时停止循环保留对象。