Boost智能指针——scoped_ptr
2024-10-21 05:09:38
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指针是不能转换其所有权的。
- 不能转换所有权
boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。 - 不能共享所有权
这点和std::auto_ptr类似。这个特点一方面使得该指针简单易用。另一方面也造成了功能的薄弱——不能用于stl的容器中。 - 不能用于管理数组对象
由于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,让编译器来进行更严格的检查,来发现一些不正确的赋值操作。
最新文章
- C语言 关于内存动态分配问题
- DOMContentLoaded实现
- PHP面向对象学习七 总结
- c#访问Oracle问题及解决方法
- 简单的jquery插件写法之一
- 解北大OJ1088滑雪问题的记录
- 非常的奇葩,终于解决了硬盘从盘盘符消失的问题 http://bbs.gamersky.com/thread-1712710-1-1.html (出处: 游民星空论坛)
- mysql三种binlog日志的理解
- ArcGIS 10.2 操作SQLite
- HttpServletRequest.getServletContext()一直提示找不到,而引出的问题
- 控制结构(10) 指令序列(opcode)
- dbutils工具类使用
- Delphi编程之好用的三方控件
- 引擎设计跟踪(九.14.3.1) deferred shading: Depthstencil as GBuffer depth
- Zhu-Takaoka Two-dimensional Pattern Matching
- Vue--获取数据
- JAVA第五周 动手动脑
- javascript primise本质——为了简化异步编码而针对异步操作的代理
- (转)Matlab矩阵的简单操作
- Ubuntu 12.04 部署 PostGIS 2.1
热门文章
- AC日记——Aragorn&#39;s Story HDU 3966
- js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示
- Codeforces Round #321 (Div. 2) Kefa and Park 深搜
- AnsiString类型定义的时候可以直接指定代码页,比如950繁体字,936日文
- javascript --- 对象之间的继承
- 关于在iOS设备上探测WIFI,3G,GPRS使用情况的细节
- [__NSCFConstantString size]: unrecognized selector sent to instance 错误
- webpack+vue起步
- DAO 层实现
- 2.SOAP 语法