首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scoped_ptr所有权

scoped_ptr所有权
EN

Stack Overflow用户
提问于 2013-02-02 00:51:22
回答 1查看 3.1K关注 0票数 12

可能重复: 什么是智能指针,什么时候应该使用?

我正在阅读文章,我找到了一个演示boost::scoped_ptr<T>使用的小例子。

代码语言:javascript
复制
#include <cstdlib>
#include <iostream>
#include <boost/scoped_ptr.hpp>
#include <boost/scoped_array.hpp>

static int count = 0;

class printer
{
    int m_id;

public:
    printer(void) :
        m_id(count++)
    {
    }

    ~printer(void)
    {
        std::cout << "Printer " << m_id
                  << " destroyed" << std::endl;
    }
};

int
main(void)
{
    boost::scoped_ptr<printer> p1(new printer);
    boost::scoped_ptr<printer> p2(new printer);
    std::cout << "Exiting test program" << std::endl;

    return EXIT_SUCCESS;
}

在这篇文章中,我唯一不明白的就是这句话:

使用scoped_ptr,您可以指示所有权转移是无意的或不允许的。

也许这篇文章开头是错误的,但上面这句话到底意味着什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-02 01:07:39

大多数智能指针都拥有它们所指向的对象的所有权--当时机成熟时,它们负责销毁该对象。然而,不同的智能指针具有不同的所有权语义。也就是说,它们告诉智能指针的用户如何传输所有权,如何在对象之间共享所有权,何时删除对象,等等。使用某个智能指针可以描述您对该对象的所有权的意图。所有权可以转移到其他函数或对象。

boost::scoped_ptr具有非常严格的所有权语义。它根本不允许任何所有权的转移。它通过不可复制来实现这一点(因此您不能通过值将它传递给另一个函数)。

另一个例子是,std::unique_ptr也相当严格。它的特殊能力是它可以被移除。将std::unique_ptr作为rvalue传递给函数将使该函数窃取对象的所有权。原始std::unique_ptr立即失去该所有权。这确保所有权只由一个std::unique_ptr持有。

与C++11中的const std::unique_ptr等效的是const std::unique_ptr。这是因为使它成为const,可以防止任何移动,因此所有权不能被转移。

一个简单的方法是通过一个例子来了解所有权语义有多重要。假设您使用的是一个邪恶的开发人员库,它有一个您不知道实现的函数,例如:

代码语言:javascript
复制
cat* foo();

您知道,此函数返回指向cat的指针。然而,它是一个原始指针。您不知道是否应该在某个时候销毁猫(使用delete),或者库是否会为您做这件事。您甚至不知道该对象是否实际上是动态分配的。您不知道库是否仍然保持对cat的控制。在过去,如果您有这样的函数,您需要查找文档来找出该做什么。但是,现在除了原始指针之外,我们还有智能指针,原始指针有自己的所有权语义--它们中最轻松的。它说:“你最好相信我,只要你把这个cat传递出去,我就能让它有效,但我会管理它。不要保存太久。”

然而,一个明智而善良的库开发人员现在会这样编写这个函数:

代码语言:javascript
复制
std::unique_ptr<cat> foo();

这有什么用?嗯,std::unique_ptr告诉你了很多。它告诉您,该函数正在将cat对象的所有权让给您。cat现在是你唯一的责任。它也非常有助于为您提供一个智能指针,因为您不需要考虑使用delete。您可以只使用指针,当指针超出作用域时,对象将被销毁。或者,如果愿意,可以将所有权转移到另一个函数。

但这并不意味着只有一个指针将拥有cat的所有权。作为骄傲的新主人,接下来发生什么事由你来决定。对于您来说,决定开始共享cat的所有权是完全合理的。

代码语言:javascript
复制
std::unique_ptr<cat> up = foo();
std::shared_ptr<cat> sp(up.release());

聪明善良的foo库开发人员只告诉了您她的意图。她给了你cat,现在你是主人了。现在,您可以提供自己的所有权语义。

这样,一个boost::scoped_ptr有点像一个贪婪的cat囤积者,他永远不会和任何人共享cat,也不会把猫给任何人,并且会一直保存到他们死的那天。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14657449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档