可能重复: 什么是智能指针,什么时候应该使用?
我正在阅读文章,我找到了一个演示boost::scoped_ptr<T>使用的小例子。
#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,您可以指示所有权转移是无意的或不允许的。
也许这篇文章开头是错误的,但上面这句话到底意味着什么呢?
发布于 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,可以防止任何移动,因此所有权不能被转移。
一个简单的方法是通过一个例子来了解所有权语义有多重要。假设您使用的是一个邪恶的开发人员库,它有一个您不知道实现的函数,例如:
cat* foo();您知道,此函数返回指向cat的指针。然而,它是一个原始指针。您不知道是否应该在某个时候销毁猫(使用delete),或者库是否会为您做这件事。您甚至不知道该对象是否实际上是动态分配的。您不知道库是否仍然保持对cat的控制。在过去,如果您有这样的函数,您需要查找文档来找出该做什么。但是,现在除了原始指针之外,我们还有智能指针,原始指针有自己的所有权语义--它们中最轻松的。它说:“你最好相信我,只要你把这个cat传递出去,我就能让它有效,但我会管理它。不要保存太久。”
然而,一个明智而善良的库开发人员现在会这样编写这个函数:
std::unique_ptr<cat> foo();这有什么用?嗯,std::unique_ptr告诉你了很多。它告诉您,该函数正在将cat对象的所有权让给您。cat现在是你唯一的责任。它也非常有助于为您提供一个智能指针,因为您不需要考虑使用delete。您可以只使用指针,当指针超出作用域时,对象将被销毁。或者,如果愿意,可以将所有权转移到另一个函数。
但这并不意味着只有一个指针将拥有cat的所有权。作为骄傲的新主人,接下来发生什么事由你来决定。对于您来说,决定开始共享cat的所有权是完全合理的。
std::unique_ptr<cat> up = foo();
std::shared_ptr<cat> sp(up.release());聪明善良的foo库开发人员只告诉了您她的意图。她给了你cat,现在你是主人了。现在,您可以提供自己的所有权语义。
这样,一个boost::scoped_ptr有点像一个贪婪的cat囤积者,他永远不会和任何人共享cat,也不会把猫给任何人,并且会一直保存到他们死的那天。
https://stackoverflow.com/questions/14657449
复制相似问题