【1】boost::scoped_ptr简介

boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include <boost/scoped_ptr.hpp>便可以使用。

一句话:一个作用域指针(即所谓智能指针scoped_ptr对象)独享一个动态分配的内存对象管理所有权。

【2】boost::scoped_ptr与stl::auto_ptr的联系

boost::scoped_ptr与std::auto_ptr两者都可以方便的管理单个堆内存对象。

特别的是:boost::scoped_ptr独享所有权(即就是boost::scoped_ptr对象不可以被复制或者重新赋值)。

【3】boost::scoped_ptr详解

<1> 示例代码如下:

 #include <iostream>
#include <boost/scoped_ptr.hpp> class TestScoped
{
public:
~TestScoped() { std::cout <<"destroying\n"; }
void do_something() { std::cout << "do something\n"; }
}; void TestScope_Ptr()
{
boost::scoped_ptr<TestScoped> spScoped(new TestScoped());
spScoped->do_something();
} void main()
{
std::cout<<"Test Begin ... \n";
TestScope_Ptr();
std::cout<<"Test End.\n";
} /*执行结果如下:
Test Begin ...
do something
destroying
Test End
*/

可以看到:当TestScope_Ptr函数结束(即就是离开spScoped作用域的时候),spScoped会被自动析构。这样就会避免由于忘记手动调用delete而造成内存泄漏了。

此例也正是boost::scoped_ptr是RAII的智能指针全部体现。

<2> 测试代码如下:

 void TestScope_Ptr2()
{
boost::scoped_ptr<TestScoped> spScoped(new TestScoped());
if (spScoped.get())
{
spScoped->do_something();
spScoped.release(); // 编译 error: scoped_ptr 没有 release 函数
boost::scoped_ptr<TestScoped> spScoped2;
spScoped2 = spScoped; // 编译 error: 不会导致所有权转移
}
}

此例正验证了boost::scoped_ptr不支持复制语义。

【4】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类。

Good Good Study, Day Day Up.

顺序  选择  循环  总结

[4] 智能指针boost::scoped_ptr的更多相关文章

  1. C++ 智能指针 boost::scoped_ptr分析

    1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...

  2. [5] 智能指针boost::shared_ptr

    [1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_p ...

  3. [6] 智能指针boost::weak_ptr

    [1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...

  4. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

  5. 【C/C++学院】0904-boost智能指针/boost多线程锁定/哈希库/正則表達式

    boost_array_bind_fun_ref Array.cpp #include<boost/array.hpp> #include <iostream> #includ ...

  6. 关于智能指针boost::shared_ptr

    boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎. 但在实际的使用过程中,笔者也发现了一些不足. 1.定制的删除器 shared_ptr除了可以使用默认 ...

  7. Qt智能指针简明说明

    下面的智能指针分别对应boost库,Qt库,c++11的智能指针 boost::scoped_ptr  QScopedPointer unique_ptr 在其生命期结束后会自动删除它所指的对象(确定 ...

  8. Boost中的智能指针(转)

    这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一 ...

  9. Boost智能指针使用总结

    内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 ...

随机推荐

  1. Watering Grass

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 题意: 给定一条草坪,草坪上有n个喷水装置.草坪长 ...

  2. js中获取键盘事件【转】

    <script type="text/javascript" language=JavaScript charset="UTF-8"> 2 docu ...

  3. mybatis动态SQL语句

    一 if标签 ? 1 2 3 4 5 6 <select id=" getStudentListLikeName " parameterType="StudentE ...

  4. Wcf 双工通信的应用

    概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...

  5. 示例-创建表格-指定行列&删除表格的行和列

    <body> <script type="text/javascript"> /* *上面的方法和你麻烦. *既然操作的是表格, *那么最方便的方式就是使用 ...

  6. 【iCore3 双核心板】例程十八:USB_VCP实验——虚拟串口

    实验指导书及代码包下载: http://pan.baidu.com/s/1c1erqIc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  7. android 一个简单的服务例子

    public class MessageService extends Service { // 获取消息线程 private MessageThread messageThread = null; ...

  8. phpexcel 内存溢出 优化

    最近我们公司的项目的在导出excel的时候偶尔出现内存溢出错误,经过测试发现当数据量大于5000条就出现这个问题(默认php.ini memory 是128M) Allowed memory size ...

  9. php应用路径变量问题总结

    实际效果测试,不考虑原理! 本地服务器,域名http://d.com,根路径D:\phpnow\vhosts\d.com.yii,相对根目录拥有文件/x.php代码里requeir_once /a/a ...

  10. URLRedirector 解决网页上无法访问 google CDN 的问题(fonts、ajax、themes、apis等)

    URLRedirector 解决网页上无法访问 google CDN 的问题(fonts.ajax.themes.apis等) 由于某些原因,在访问国外的网站时有时候会特别慢,像 stackoverf ...