智能指针scoped_ptr
对应C++11中的unique_ptr
- #include <iostream>
- #include <memory>
- class foo
- {
- public:
- foo() { std::cout<<"constructor"<<std::endl;}
- ~foo() { std::cout<<"destructor"<<std::endl; }
- void doit() { std::cout<<"do"<<std::endl; }
- };
- int main()
- {
- std::unique_ptr<foo> sf(new foo);
- sf->doit();
- (*sf).doit();
- sf.reset(new foo);
- sf->doit();
- return 0;
- }
scoped_ptr的所有权更加严格,不允许转让,对其赋值和拷贝都是不合法行为,因而显得更轻巧和快捷。
scoped_ptr重载了operator*()和operator->()解引用操作符*和箭头操作符->,因此可以把scoped_ptr对象如同指针一样使用。如果scoped_ptr保存的空指针,那么这两个操作的行为未定义。
scoped_ptr不能在两个scoped_ptr之间、scoped_ptr与原始指针之间或空指针之间进行了相等或不相等测试。operator ==和operator !=都被声明为私有。
scoped_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类。成员函数
功能
operator*()
以引用的形式访问所管理的对象的成员
operator->()
以指针的形式访问所管理的对象的成员
reset()
释放所管理的对象,管理另外一个对象
swap(scoped_ptr& b)
交换两个boost::scoped_ptr管理的对象
- template<class T> class scoped_ptr // noncopyable
- {
- private:
- T * px;
- scoped_ptr(scoped_ptr const &);
- scoped_ptr & operator=(scoped_ptr const &);
- typedef scoped_ptr<T> this_type;
- void operator==( scoped_ptr const& ) const;
- void operator!=( scoped_ptr const& ) const;
- public:
- typedef T element_type;
- explicit scoped_ptr( T * p = 0 ); // never throws
- explicit scoped_ptr( std::auto_ptr<T> p ); // never throws
- ~scoped_ptr() // never throws在其作用域结束时自动删除保存的指针对象,从而正确地回收资源
- void reset(T * p = 0) // never throws删除原来保存的指针,再保存新的指针p,如果p是空指针,那scoped_ptr将不持有任何指针
- {
- BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
- this_type(p).swap(*this);
- }
- T & operator*() const // never throws
- {
- BOOST_ASSERT( px != 0 );
- return *px;
- }
- T * operator->() const // never throws
- {
- BOOST_ASSERT( px != 0 );
- return px;
- }
- T * get() const // never throws返回scoped_ptr内部保存的原始指针
- {
- return px;
- }
- void swap(scoped_ptr & b);// never throws交换两个scoped_ptr保存的原始指针
- };
智能指针scoped_ptr的更多相关文章
- [转] Boost智能指针——scoped_ptr
http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...
- Boost智能指针——scoped_ptr
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...
- [4] 智能指针boost::scoped_ptr
[1]boost::scoped_ptr简介 boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include <boost/scoped_ ...
- C++ 智能指针 boost::scoped_ptr分析
1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...
- 【C++深入浅出】智能指针之auto_ptr学习
起: C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...
- c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...
- 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
目录 C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector). auto_ptr scoped_ptr ptr_vector C++智能指针,指针容器原 ...
随机推荐
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...
- 洛谷 P3749: LOJ 2146: [SHOI2017]寿司餐厅
题目传送门:LOJ #2146. 题意简述: 有 \(n\) 种寿司,第 \(i\) 种寿司的类型为 \(a_i\). 如果你吃了第 \(i\) 种到第 \(j\) 种寿司,你会得到 \(d_{i,j ...
- 用一句SQL查询相对复杂的统计报表
--统计从2017年3月份开始每个月金融服务支付前分期申请数以及通过(核账完成)数 ,ApplyTime)) ,ApplyTime)) as varchar)+'月' as 日期,count(*) a ...
- php递归函数细节
<?php /** *php递归函数细节 *从1到5的阶乘 * */ header("Content-Type:text/html;charset=utf-8"); func ...
- php如何优雅地把数组传递给前端js脚本?
比如说http://echarts.baidu.com/demo...这个例子中,一般里面的timeData数组都是数据库的所有记录的单独某一个列的集合,而例子中第149行的 data:[ 1,2,3 ...
- Fiddler实现移动端手机抓包
Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的“进出”的数据(指co ...
- SpringBoot-定制banner
我们在启动Spring Boot项目的时候,在控制台会默认输出一个启动图案 这个图案如果你需要的话是可以自己修改的,修改方式很简单 1.在src/main/resources下新建一个banner.t ...
- windows下安装apache zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 【LOJ】#2532. 「CQOI2018」社交网络
题解 基尔霍夫矩阵,外向树是入度矩阵-邻接矩阵 必须删掉第一行第一列然后再求行列式 代码 #include <bits/stdc++.h> #define fi first #define ...
- 【LOJ】#2527. 「HAOI2018」染色
题解 简单容斥题 至少选了\(k\)个颜色恰好出现\(S\)次方案数是 \(F[k] = \binom{M}{k} \frac{N!}{(S!)^{k}(N - i * S)!}(M - k)^{N ...