相关疑难解决方法(0)

聪明的指针:或谁拥有你的宝贝?

C++完全是关于内存所有权
Aka" Ownership Semantics "

一块动态分配的内存的所有者负责释放该内存.所以这个问题真的变成了拥有记忆的人.

在C++中,所有权都是由RAW指针包含在内部的类型记录的,因此在一个好的(IMO)C++程序中,很少见[RARE并非永远]看到RAW指针传递(因为RAW指针没有推断的所有权因此我们不能告诉谁拥有记忆,因此如果没有仔细阅读文件,你无法分辨谁负责所有权).

相反,很少看到RAW指针存储在类中,每个RAW指针都存储在自己的SMART指针包装器中.(注意:如果你没有一个对象,你不应该存储它,因为你不知道什么时候它会超出范围并被销毁.)

所以问题是:

  • 人们遇到什么类型的所有权语义?
  • 使用哪些标准类来实现这些语义?
  • 你认为它们在哪些情况下有用?

让我们为每个答案保留一种语义所有权,这样他们就可以单独上下投票

摘要:

从概念上讲,智能指针很简单,而且简单易用.我已经看过许多尝试过的实现,但总是以某种方式打破它们,这对于随意使用和示例来说并不明显.因此,我建议始终使用经过良好测试的"智能指针",而不是自己动手.std :: auto_ptr或其中一个提升智能指针似乎涵盖了我的所有需求.

的std :: auto_ptr的<T>:

单身人士拥有该物品.
但允许转让所有权.

用法:
======
这允许您定义显示所有权显式转移的接口.

升压:: scoped_ptr的<T>

单身人士拥有该物品.
不允许转让所有权.

用法:
======
用于显示明确的所有权.
对象将被析构函数或显式重置时销毁.

boost :: shared_ptr <T>(std :: tr1 :: shared_ptr <T>)

多个所有权.
这是一个简单的引用计数指针.当引用计数达到零时,对象被销毁.

用法:
======
当对象可以有多个owers,其生命周期无法在编译时确定.

升压::的weak_ptr <T>

与shared_ptr <T>一起使用.
在指针循环可能发生的情况下.

用法:
======
用于在仅循环维护共享引用计数时停止保留对象的周期.

c++ memory-management smart-pointers ownership-semantics

113
推荐指数
3
解决办法
5万
查看次数

对象的共享所有权是不良设计的标志吗?

背景:在阅读Stroustrup博士的论文和常见问题解答时,我注意到传奇的CS科学家和程序员提出了一些强烈的"意见"和很好的建议.其中一个是关于shared_ptrC++ 0x.他开始解释shared_ptr它以及它如何代表指向对象的共享所有权.在最后一行,他说,我引用:

.A shared_ptr代表共享所有权,但共享所有权不是我的理想:如果一个对象具有明确的所有者和明确的,可预测的寿命,那就更好了.

我的问题:RAII在多大程度上取代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权.

c++ garbage-collection raii

11
推荐指数
2
解决办法
1157
查看次数