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

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

 #include <string>
#include <iostream>
#include <boost/scoped_ptr.hpp> class implementation
{
public:
~implementation() { std::cout <<"destroying implementation\n"; }
void do_something() { std::cout << "did something\n"; }
}; void test()
{
boost::scoped_ptr<implementation> impl(new implementation());
impl->do_something();
} void main()
{
std::cout<<"Test Begin ... \n";
test();
std::cout<<"Test End.\n";
}

输出结果是:

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,让编译器来进行更严格的检查,来发现一些不正确的赋值操作。

 

最新文章

  1. C语言 关于内存动态分配问题
  2. DOMContentLoaded实现
  3. PHP面向对象学习七 总结
  4. c#访问Oracle问题及解决方法
  5. 简单的jquery插件写法之一
  6. 解北大OJ1088滑雪问题的记录
  7. 非常的奇葩,终于解决了硬盘从盘盘符消失的问题 http://bbs.gamersky.com/thread-1712710-1-1.html (出处: 游民星空论坛)
  8. mysql三种binlog日志的理解
  9. ArcGIS 10.2 操作SQLite
  10. HttpServletRequest.getServletContext()一直提示找不到,而引出的问题
  11. 控制结构(10) 指令序列(opcode)
  12. dbutils工具类使用
  13. Delphi编程之好用的三方控件
  14. 引擎设计跟踪(九.14.3.1) deferred shading: Depthstencil as GBuffer depth
  15. Zhu-Takaoka Two-dimensional Pattern Matching
  16. Vue--获取数据
  17. JAVA第五周 动手动脑
  18. javascript primise本质——为了简化异步编码而针对异步操作的代理
  19. (转)Matlab矩阵的简单操作
  20. Ubuntu 12.04 部署 PostGIS 2.1

热门文章

  1. AC日记——Aragorn&#39;s Story HDU 3966
  2. js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示
  3. Codeforces Round #321 (Div. 2) Kefa and Park 深搜
  4. AnsiString类型定义的时候可以直接指定代码页,比如950繁体字,936日文
  5. javascript --- 对象之间的继承
  6. 关于在iOS设备上探测WIFI,3G,GPRS使用情况的细节
  7. [__NSCFConstantString size]: unrecognized selector sent to instance 错误
  8. webpack+vue起步
  9. DAO 层实现
  10. 2.SOAP 语法