scoped _ptr的模拟实现与解析

头文件: "boost/scoped_ptr.hpp"

boost::scoped_ptr 用于确保动态分配的对象能够被正确地删除。scoped_ptr有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权,然而auto_ptr却可以。事实上,scoped_ptr永远不能被复制或被赋值!scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权。scoped_ptr的这种特性改进了代码的表示方式,我们可以根据需要选择最合适的智能指针(scoped_ptr或auto_ptr)。

要决定使用std::auto_ptr还是boost::scoped_ptr, 就要考虑转移所有权是不是你想要的智能指针的一个特性。如果不是,就用scoped_ptr. 它是一种轻量级的智能指针;使用它不会使你的程序变大或变慢。它只会让你的代码更安全,更好维护。

下面是scoped _ptr的模拟实现

template <class T>

class ScopedPtr

{

public:

ScopedPtr( T* ptr )

:_ptr( ptr)

{}

~ScopedPtr()

{

if (_ptr)

{

delete _ptr;

}

}

T&operator*()

{

return *_ptr;

}

T *operator->()

{

return _ptr;

}

T *GetPtr()

{

return _ptr;

}

protected:

ScopedPtr( const ScopedPtr <T> &Sp);

ScopedPtr<T >operator=(const ScopedPtr<T >&Sp);

private:

T*_ptr;

};

ScopedPtr( T* ptr )

构造函数,存储ptr的一份拷贝。注意,ptr 必须是用operator new分配的,或者是null.在构造的时候,不要求T必须是一个完整的类型。当指针p是调用某个分配函数的结果而不是直接调用new得到的时候很有用:因为这个类型不必是完整的,只需要类型T的一个前向声明就可以了。这个构造函数不会抛出异常。

~ScopedPtr()

删除指针所指向的对象。类型T在被销毁时必须是一个完整的类型。如果scoped_ptr在它被析构时并没有保存资源,它就什么都不做。这个析构函数不会抛出异常。

T&operator*()

该运算符返回一个智能指针中存储的指针所指向的对象的引用。由于不允许空的引用,所以解引用一个拥有空指针的scoped_ptr将导致未定义行为。如果不能肯定所含指针是否有效,就用函数GetPtr替代解引用。这个函数不会抛出异常。

T *operator->()

返回智能指针所保存的指针。如果保存的指针为空,则调用这个函数会导致未定义行为。如果不能肯定指针是否空的,最好使用函数GetPtr。这个函数不会抛出异常。

T *GetPtr()

返回保存的指针。应该小心地使用GetPtr,因为它可以直接操作裸指针。但是,GetPtr使得你可以测试保存的指针是否为空。这个函数不会抛出异常。GetPtr通常在调用那些需要裸指针的函数时使用。

用法

scoped_ptr的用法与普通的指针没什么区别;最大的差别在于你不必再记得在指针上调用delete,还有复制是不允许的。典型的指针操作(operator* 和 operator->)都被重载了,并提供了和裸指针一样的语法。用scoped_ptr和用裸指针一样快,也没有大小上的增加,因此它们可以广泛使用。使用boost::scoped_ptr时,包含头文件"boost/scoped_ptr.hpp". 在声明一个scoped_ptr时,用被指物的类型来指定类模板的参数。例如,以下是一个包含std::string指针的scoped_ptr:

boost::scoped_ptr<std::string> p(new std::string("Hello"));

当scoped_ptr被销毁时,它对它所拥有的指针调用delete 。

时间: 2024-12-25 05:53:40

scoped _ptr的模拟实现与解析的相关文章

模拟构建DNS解析流程

背景 DNS初步认识 ??DNS(Domain Name Server,域名系统)是互联网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去费力的记忆IP字符串.通过域名,最终可以得到该域名对应的IP地址的过程叫做域名解析.DNS协议运行在UDP洗衣上,使用的是53号端口.???? DNS的重要性以及高可用(DNS冗余) 重要性 ????DNS解析是目前互联网大多数应用的实际的寻址方式:域名技术的不断发展,和基于域名技术出现的新技术和新思路极大的丰富了互联网的应

用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)

老婆大人每个月都要上一个网站上去查数据,然后做报表. 为了减轻老婆大人的工作压力,所以我决定做个小程序,减轻我老婆的工作量. 准备工作 1.tesseract-ocr 这个工具用来识别验证码,非常好用. ubuntu上安装: sudo apt-get install tesseract-ocr 非常简单. 2.pytesseract和PIL(pillow) pytesseract用来在python中调用tesseract-ocr,PIL(pillow)用来加载图片,安装方法如下: pip3 in

【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization): 资源分配即初始化,定义封装一个类,用来实现调用构造函数时就可完成资源的分配和初始化,在调用析构函数就可完成资源的清理,以实现对资源的初始化和清理. 智能指针: 用自动化或者说智能的指针来实现对动态内存的释放. 它是一个类,有类似指针的功能. 常见的智能指针有:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,我们今天先讲以下三种. 一.Aut

Android HandlerThread 完全解析

想想已经理解的Handler异步处理流程,你就很容易理解HandlerThread. 在你看原文之前,我给你捋一捋思路,方便你理解鸿洋前辈的文章. A线程要发消息给B线程,那么B线程必须持有A线程的Handler,之后在B线程中发消息发消息给A线程,B线程中处理消息(收发分别在俩线程中进行,加上MessageQueue正好构成异步通信),队列在A线程中(Looper对象也在A线程中,什么looper.prepare()以及looper.loop()当然也在A线程中) 到了HandlerThrea

AndroidHandlerThread完全解析(转载)

AndroidHandlerThread完全解析 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47079737: 本文出自:[张鸿洋的博客] 1.概述 话说最近股市变动不变,也成了热火朝天的话题.不知道大家有没有考虑做个实时更新股市数据的app呢?假设我们要做一个股市数据实时更新的app,我们可以在网上找个第三方的股市数据接口,然后在我们的app中每隔1分钟(合适的时间)去更新数据,然后更新我们的UI即可. 当然了,本文不

APP网络测试要点和弱网模拟

当前APP网络环境比较复杂,网络制式有2G.3G.4G网络,还有越来越多的公共Wi-Fi.不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响.另外,当前app使用场景多变,如进地铁.上公交.进电梯等,使得弱网测试显得尤为重要.如果app没有对各种网络异常进行兼容处理,那么用户可能在日常生活中遇到APP闪退.ANR.数据丢失等问题.因此,app网络测试,特别是弱网测试尤为重要.本文梳理了app网络测试要点和弱网测试常用模拟方法,让大家对网络测试有一个全面的认识. APP网络测试要点

linux 第十八天学习(DNS分离解析、DHCP配置、邮件服务配置)

DNS分离解析技术 yum install bind-chroot systemctl restart named systemctl enable named vim /etc/named.conf vim /etc/named.rfc1912.zones 配置网卡 cd /var/named/ cp -a named.localhost dream.com.china cp -a named.localhost dream.com.american vim dream.com.china v

2014半年小总结

2014半年小总结 已经毕业工作快满两年了,从一家垄断国字号企业跳到某电商平台,应该是我的职业生涯第一跳了,也很荣幸地投身入互联网浪潮之中.没过多久就融入了这家朝气蓬勃的大家庭.回汉后,起初打算做机器学习.数据挖掘的相关工作,以能延续研究生的课题.不过作为新东家BI组第一位员工,不得不着手搭建基础数据平台. 工作成果与心得 基础数据平台和报表系统,爬虫 五个月,小半年,我们三兄弟的工作成果也是比较显著,在被领导否定第一版数据平台后,开始重新搭建新js埋点作为数据源的基础数据平台. 1. jugg

DNS详解(一)

一.域名系统(Domain Name System, DNS) 在Internet网络中,计算机相互识别彼此靠的是IP,IP就是用句号分割的一串数字,如202.156.36.89.然而对于人类而言,这样的数字是不容易记忆的,于是给这些数字起名字,这些名字就是所谓的域名.每个域名只能对应一个IP地址(此语似乎有误,但尚未理解,欢迎拍砖),但是同一个IP可以有几个名字,其中一个称为规范主机名,其他的称为别名. 说到起名字,是不能乱起的.DNS发展过程中,人们逐渐规范了域名的命名方式,即采用句点分隔的