单一与共享所有权的含义

CjC*_*oax 13 c++ ownership

刚刚看到和拥有时正在阅读维基百科的RAII.SingleShared

用Google搜索并找不到任何有用的答案!

有人可能会为一个小学生解释这个概念吗?

Pub*_*bby 23

它本质上是unique_ptrVS shared_ptr.

单一所有权(也称为唯一所有权)意味着资源由单个类实例拥有.一旦该实例不再存在,资源就会被释放(通过析构函数).您找到的大多数RAII课程都具有独特的所有权,例如std::vector.

共享所有权意味着资源在多个类实例之间共享.资源仅在每个实例不再存在时才会释放,因此需要某种形式的引用计数或垃圾回收.您希望共享所有权的位置示例是复制不可变资源的非常昂贵的句柄.我已经看到它也用在图表中.

根据指针思考可能会有所帮助.单一所有权只有1个拥有指针,共享将有多个.当然,RAII可能不涉及指针.

                    +---------------+
                    |Shared instance|
    +--------+      +------------+--+           +---------------+
    |Resource|                   |   +----------+Shared instance|
    +--------+                   v   v          +---------------+
        ^                    +--------+
        |                    |Resource|<-----------+
        |                    +--------+        +---+-----------+
        |                         ^            |Shared instance|
 +------+--------+                |            +---------------+
 |Unique Instance|                |
 +---------------+                |
                           +------+--------+
                           |Shared instance|
                           +---------------+
Run Code Online (Sandbox Code Playgroud)

  • 你用什么做那个图? (2认同)

kfm*_*e04 8

所有权可变生命期的概念密切相关.

如果你能回答这个问题,那么这块内存什么时候可以消失呢?,那么你可以回答所有权问题.

如果该块内存仅与一个变量的生命周期相关联,那么您拥有单一所有权.

请注意,考虑动态分配与堆栈自动变量也很重要.对于自动变量,当它们超出范围时,将获得与它们相关联的存储器.在一般情况下,通过动态分配,情况并非如此.如果您使用std :: unique_ptr <>这样的新工具来实现单一所有权,那么当它超出范围时,您可以使一大块动态内存自行清理.如果有很多对内存块的引用,并且引用将在何时消失,那么你可能需要像std :: shared_ptr <>这样的多个所有权.


Sea*_*ine 6

所有权归结为谁负责释放资源.通常,您可以说代码的一部分(无论是函数还是类)是资源的唯一所有者.完成资源后,所有者必须释放它以使资源不泄漏.这称为单一或唯一所有权.

同样,存在共享所有权的概念,其中代码的两个或更多个离散部分,再次它们可以是类或函数,都依赖于相同的资源.在这种情况下,在释放资源之前,它们都不再需要资源.

C++提供了两个有用的包装器来传达和强制所有权语义 - 所有权语义如上所述.这些包装器将RAII的概念泛化- 一旦资源超出范围就自动释放资源.

  • unique_ptr - 包含在唯一指针中的对象将在超出范围时立即释放,这意味着函数返回或类被销毁.

  • shared_ptr - 包含在共享指针中的对象将保持可用,直到所有"强引用"都超出范围.这是一个称为引用计数的概念.一旦最终引用超出范围,就会释放资源.

所有权语义在C++等语言中非常重要,因此我建议您熟悉现代 C++ 如何传达和强制执行它.你可以通过学习正确的使用开始unique_ptrshared_ptr.