码迷,mamicode.com
首页 > 其他好文 > 详细

Boost智能指针——scoped_ptr

时间:2014-07-01 18:58:19      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   strong   

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。

上一段代码,以及其输出:

 1 #include <string>
 2 #include <iostream>
 3 #include <boost/scoped_ptr.hpp>
 4 
 5 class implementation
 6 {
 7 public:
 8     ~implementation() { std::cout <<"destroying implementation\n"; }
 9     void do_something() { std::cout << "did something\n"; }
10 };
11 
12 void test()
13 {
14     boost::scoped_ptr<implementation> impl(new implementation());
15     impl->do_something();
16 }
17 
18 void main()
19 {
20     std::cout<<"Test Begin ... \n";
21     test();
22     std::cout<<"Test End.\n";
23 }

输出结果是:

Test Begin ...

did something

destroying implementation

Test End.

可以看到:当implementation类离其开impl作用域的时候,会被自动删除,这样就会避免由于忘记手动调用delete而造成内存泄漏了。

boost::scoped_ptr特点:

boost::scoped_ptr的实现和std::auto_ptr非常类似,都是利用了一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上的对象销毁时自动删除。不同的是,boost::scoped_ptr有着更严格的使用限制——不能拷贝。这就意味着:boost::scoped_ptr指针是不能转换其所有权的。

  1. 不能转换所有权
    boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。
  2. 不能共享所有权
    这点和std::auto_ptr类似。这个特点一方面使得该指针简单易用。另一方面也造成了功能的薄弱——不能用于stl的容器中。
  3. 不能用于管理数组对象
    由于boost::scoped_ptr是通过delete来删除所管理对象的,而数组对象必须通过deletep[]来删除,因此boost::scoped_ptr是不能管理数组对象的,如果要管理数组对象需要使用boost::scoped_array类。

boost::scoped_ptr和std::auto_ptr的选取:

boost::scoped_ptr和std::auto_ptr的功能和操作都非常类似,如何在他们之间选取取决于是否需要转移所管理的对象的所有权(如是否需要作为函数的返回值)。如果没有这个需要的话,大可以使用boost::scoped_ptr,让编译器来进行更严格的检查,来发现一些不正确的赋值操作。

 

 

Boost智能指针——scoped_ptr,布布扣,bubuko.com

Boost智能指针——scoped_ptr

标签:des   style   blog   color   使用   strong   

原文地址:http://www.cnblogs.com/chengyeliang/p/3817690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!