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的常用操作:

可以简化为如下形式:

namespace boost {

template<typename T> class scoped_ptr : noncopyable {
    public:
        explicit scoped_ptr(T* p = 0);
        ~scoped_ptr();

void reset(T* p = 0);

T& operator*() const;
        T* operator->() const;
        T* get() const;

void swap(scoped_ptr& b);
    };

template<typename T>
    void swap(scoped_ptr<T> & a, scoped_ptr<T> & b);
}

它的常用操作如下:

成员函数

功能

operator*()

以引用的形式访问所管理的对象的成员

operator->()

以指针的形式访问所管理的对象的成员

get()

释放所管理的对象,管理另外一个对象

swap(scoped_ptr& b)

交换两个boost::scoped_ptr管理的对象

下列测试代码演示了这些功能函数的基本使用方法。

#include<string>
#include<iostream>

#include<boost/scoped_ptr.hpp>
#include<boost/scoped_array.hpp>

#include<boost/config.hpp>
#include<boost/detail/lightweight_test.hpp>

void test()
{
    // test scoped_ptr with a built-in type
    long * lp = newlong;
    boost::scoped_ptr<long> sp ( lp );
    BOOST_TEST( sp.get() == lp );
    BOOST_TEST( lp == sp.get() );
    BOOST_TEST( &*sp == lp );

*sp = 1234568901L;
    BOOST_TEST( *sp == 1234568901L );
    BOOST_TEST( *lp == 1234568901L );

long * lp2 = newlong;
    boost::scoped_ptr<long> sp2 ( lp2 );

sp.swap(sp2);
    BOOST_TEST( sp.get() == lp2 );
    BOOST_TEST( sp2.get() == lp );

sp.reset(NULL);
    BOOST_TEST( sp.get() == NULL );

}

void main()
{
    test();
}

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

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

Boost智能指针——scoped_ptr相关推荐

  1. [转] Boost智能指针——scoped_ptr

    http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...

  2. 在你的代码中使用Boost智能指针

    在你的代码中使用Boost智能指针 Smart Pointers to boost your code(By peterchen)  翻译 masterlee Download source file ...

  3. boost智能指针之shared_ptr,scoped_ptr,intrusive_ptr,weak_ptr源码简析

    boost库实现了各种智能指针,基本上都纳入了c++11标准中,boost库的smart_ptr目录下就是各种指针的实现了: 1.shared_ptr template<class T> ...

  4. 【Boost】boost库中智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...

  5. Boost智能指针——boost::scoped_ptr(使用及原理分析)

    简介 boost::scoped_ptr是一个比较简单的智能指针,它能保证在离开作用域之后它所管理对象能被自动释放.下面这个例子将介绍它的使用: 1 #include <iostream> ...

  6. Boost智能指针——shared_ptr

    boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以 ...

  7. boost any 实现万能容器_全面剖析 C++ Boost 智能指针!| CSDN 博文精选

    作者 | .NY&XX 责编 | 屠敏 出品 | CSDN 博客 为什么要使用智能指针 C++没有提供类似JAVA的垃圾回收机制,因此Boost可以通过智能指针来管理内存避免一些问题.C++继 ...

  8. 全面剖析 C++ Boost 智能指针! | CSDN 博文精选

    作者 | .NY&XX 责编 | 屠敏 出品 | CSDN 博客 为什么要使用智能指针 C++没有提供类似JAVA的垃圾回收机制,因此Boost可以通过智能指针来管理内存避免一些问题.C++继 ...

  9. Boost智能指针——weak_ptr

    循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string> #include <ios ...

最新文章

  1. java中的NAN和INFINITY
  2. 2018html游戏引擎,跨平台三维游戏引擎Unity Pro 2018.1 Win x64
  3. SonarQube是如何工作的
  4. EntityFramework Core是否可以映射私有属性呢?了解一下。
  5. apache camel_REST端点,可使用Apache Camel进行集成
  6. 常用开源 SLAM 方案
  7. 西门子PLC与安川变频器Modbus通信
  8. 7,JESD204B接口的关键问题
  9. 计算机硬件cpu指令执行过程,cpu执行指令的过程详解
  10. 过 DNF TP 驱动保护(二)
  11. SIFT、SURF、Harris、BRIEF、FAST、DAISY、FAST经典描述子简介
  12. 半透明物体与深度写入
  13. 区块链技术最佳的监管方式是智能合约监管智能合约
  14. 国产操作系统UOS安装教程
  15. 用机器学习计算工作技能匹配度
  16. 【LINUX】libgd-GD库安装
  17. 伤寒论(太阳病笔记)——学习笔记,更待前辈指点
  18. 鸿蒙系统 美的,美的九阳搭载鸿蒙系统的家电上市了,这手机系统上市真的稳了...
  19. django rest framework学习准备,面向对象中类的使用。
  20. python爬虫实战之逆向分析酷狗音乐

热门文章

  1. Mysql显示创建表的sql语句
  2. Oracle常见错误
  3. window的war发布Linux失败,为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?...
  4. Hive笔记之JOIN的左外链接和右外链接
  5. [Alg] 二叉树的非递归遍历
  6. Storm环境搭建(分布式集群)
  7. 浅谈高斯消元的实现和简单应用
  8. PCL—关键点检测(rangeImage)低层次点云处理
  9. mac安装需要的骚操作
  10. 基于用户击键特征的身份鉴别系统