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>
可能发生指针循环的情况。
用法:仅当循环维护共享引用计数时,用于停止保留对象的循环。
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
可以改写吗?我一点都不明白。
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
。RAW指针没有所有权语义。如果您不了解所有者,那么您不知道谁负责删除对象。有几种标准的类用于包装指针(std :: shared_ptr,std :: unique_ptr等),这些指针定义了所有权,因此定义谁负责删除指针。