scoped_ptr ownership
Possible Duplicate:
What is a smart pointer and when should I use one?
号
我读了一篇文章,找到了一个小例子来演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #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; } |
这篇文章中我唯一不明白的是这句话:
using
scoped_ptr , you indicate that ownership transfer is not intended or allowed.
号
也许这篇文章从一个初学者的角度出发是错误的,但是上面这一行到底意味着什么呢?
大多数智能指针都拥有指向的对象的所有权——它们负责在时间到来时销毁该对象。然而,不同的智能指针具有不同的所有权语义。也就是说,它们告诉智能指针的用户,所有权可以或不可以被转移,如何在对象之间共享,何时应该删除对象,等等。使用某个智能指针描述您对该对象所有权的意图。所有权可以转移到其他功能或对象。
另一个例子是,
在C++ 11中等效于EDCOX1〔0〕是EDCOX1〔6〕。这是因为使之成为
通过一个例子,可以很容易地看出所有权语义有多重要。假设您使用的是一个邪恶的开发人员库,它具有一个您不知道实现的功能,例如:
1 | cat* foo(); |
您知道这个函数返回一个指向
然而,一个聪明善良的库开发人员现在可以这样编写这个函数:
1 | std::unique_ptr<cat> foo(); |
那么这有什么帮助呢?好吧,江户记[1]告诉你很多。它告诉您,该函数正在向您放弃
但这并不意味着只有一个指针拥有
1 2 | std::unique_ptr<cat> up = foo(); std::shared_ptr<cat> sp(up.release()); |
聪明善良的
这样的话,一个江户〔0〕有点像一个贪婪的江户〔8〕囤积者,他永远不会和任何人分享江户〔8〕的东西,永远不会把猫给任何人,也不会把猫留到他们死的那天。