1. 简介

scoped_ptr类似于智能指针只能在作用域里使用,不希望被转让。

2. 类与接口

#ifndef _SCOPE_PTR_HH
#define _SCOPE_PTR_HH
//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
//  of the object pointed to, either on destruction of the scoped_ptr or via
//  an explicit reset(). scoped_ptr is a simple solution for simple needs;
//  use shared_ptr or std::auto_ptr if your needs are more complex./*
scoped_ptr 是局部智能指针 不允许转让所有权。
*/
template <class T>
class scoped_ptr
{public://存储p的一份拷贝。注意,p 必须是用operator new分配的,或者是null. 在构造的时候,不要求T必须是一个完整的类型。//当指针p是调用某个分配函数的结果而不是直接调用new得到的时候很有用:因为这个类型不必是完整的,只需要类型T的一个前向声明就可以了。//这个构造函数不会抛出异常。scoped_ptr(T *p = 0) :m_ptr(p){}//当scoped_ptr对象的生命周期结束时,析构函数~scoped_ptr()会使用delete操作自动销毁所保存的指针对象,从而正确的回收资源。~scoped_ptr(){delete m_ptr;}//该运算符返回一个智能指针中存储的指针所指向的对象的引用。//由于不允许空的引用,所以解引用一个拥有空指针的scoped_ptr将导致未定义行为。//如果不能肯定所含指针是否有效,就用函数get替代解引用。这个函数不会抛出异常。T&operator*() const{return *m_ptr;}//返回智能指针所保存的指针。//如果保存的指针为空,则调用这个函数会导致未定义行为。//如果不能肯定指针是否空的,最好使用函数get。这个函数不会抛出异常。T*operator->() const{return m_ptr;}//拥有权不允许转让  但是可以让智能指针指向另一个空间//重置scoped_ptr;它删除原来报存的指针,再保存新的指针值p。//如果p是空指针,那么scoped_ptr将不能持有任何指针。//一般情况下reset()不应该被调用,因为它违背了scopd_ptr的本意——资源应该一直由scopd_ptr自己自动管理。void reset(T *p){if (p != m_ptr && m_ptr != 0)delete m_ptr;m_ptr = p;}//返回保存的指针。//应该小心地使用get,因为它可以直接操作裸指针。//但是,get使得你可以测试保存的指针是否为空。这个函数不会抛出异常。get通常在调用那些需要裸指针的函数时使用。T* get() const{return m_ptr;}//返回scoped_ptr是否为非空。//在C++中,operator TypeName()语法用来将对象转换为指定的TypeName类型,当这里TypeName为bool时,就可以直接在条件判断式里面直接用该对象//参考https://www.cnblogs.com/HachikoT/p/12731372.html//在if语句中最好使用这个类型转换函数,而不要用get去测试scoped_ptr的有效性operator bool() const{return get() != NULL;}private://将拷贝构造和赋值  以及判等判不等  都设置为私有方法//对象不再能调用,即不能拷贝构造和赋值  也就达到了不让转移拥有权的目的scoped_ptr(const scoped_ptr<T> &y);const scoped_ptr<T> operator=(const scoped_ptr<T> &);void operator==(scoped_ptr<T> const &) const;void operator!=(scoped_ptr<T> const &) const;T* m_ptr;
};#endif

3. 使用

//
//  test_scopedptr.cc
//  test_scopedptr
//
//  Created by blueBling on 22-04-12.
//  Copyright (c) 2022年blueBling. All rights reserved.
//#include "scoped_ptr.h"#include "assert.h"#include <iostream>
#include <memory>using std::cout;
using std::endl;
using std::auto_ptr;int test_scoped_ptr() {scoped_ptr<int> sp(new int(10));assert(sp == true);cout << *sp << endl;sp.reset(new int(20));cout << *sp << endl;scoped_ptr<int>sp2;          //另一个scoped_ptr//sp2 = sp;                     //赋值操作,无法同过编译!return 0;
}int main() {test_scoped_ptr();return 0;
}

输出结果:

10
20

4. 源码

Github

muduo scoped_ptr详解相关推荐

  1. muduo BlockingQueue详解

    1. 简介 利用条件变量和std::deque实现阻塞队列 2. 类与接口 插入数据,有2个版本 void put(const T& x) 非常量可以初始化一个底层const,反过来却不行 可 ...

  2. muduo StringPiece详解

    1. 简介 该StringPiece是PCRE的实现,是对字符串的一个proxy类而已(即设计模式中的代理模式). 2. 背景 很多时候,当传入一个字符串到函数时,往往只是读取字符串时 若使用std: ...

  3. muduo Date详解

    1. 简介 用于Julian Day和普通年月日的转换 2. 类与接口 2.1 class Date : public copyable ① Date::Date(int y, int m, int ...

  4. muduo Timestamp详解

    1. 简介 Timestamp用于提供时间戳相关的工具函数. 2. 类与接口 ① string toString() const 返回时间的字符串形式,例如1649224501.687051 ② st ...

  5. muduo Thread详解

    1. 简介 Thread用于线程管理. 2. pthread_atfork 在进行linux系统里开发时,经常会调用linux的系统函数fork来产生一个子进程,如果父子进程都没有用到pthread线 ...

  6. muduo Mutex详解

    1. 简介 多线程环境下利用pthread进行共享资源的互斥操作,该模块使用了Thread safety annotations技术,若使用了cling c++解析器,可以在编译时进行线程安全分析,如 ...

  7. muduo Logging详解

    1. 简介 Logging用于将日志事件信息(时间 日志级别 文件名 行号等)加到输出缓冲区,默认输出到stdout. 2. 类与接口 ① 私有内部类Impl 将日志事件(时间 日志级别 文件名 行号 ...

  8. C++ 智能指针详解

    智能指针内容很多,重点是基本用法. #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_fro ...

  9. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

最新文章

  1. Android 将ARGB图片转换为灰度图
  2. C语言以下4个选项中,不能看作一条语句的是?
  3. lodsb、stosb(和lodsw、stosw和lodsd、stosd指令)
  4. Android button 居中
  5. linux ifconfig命令参数及用法详解--linux查看配置网卡命令
  6. 局域主机做服务器,安装DNN,外网访问的解决办法
  7. 2018 年最受欢迎的15个顶级 Python 库
  8. Apache Calcite官方文档中文版-概览-1.背景
  9. 机器学习实现计算不规则图形面积_《图形编程技术学习》(五十八)用VS实现逐顶点的光照计算...
  10. POJ-1087 A Plug for UNIX 网络流
  11. java集成(支付宝)蚂蚁金服
  12. 2048小游戏最佳算法C语言,2048游戏的最佳算法是什么?
  13. 使用两个栈实现一个队列
  14. java 出路 xls_java读取excel之xlsl超大文件
  15. α波、β波、θ波和δ波
  16. 阿里云用域名、ip访问不了网站
  17. vue项目如何打包以及如何变成android、ios应用程序
  18. 联通沃云 服务器 FTP安装设置
  19. 新家入住气味难忍 除去甲醛有妙招
  20. 弘辽科技:拼多多没出单改销量吗?拼多多如何提高销量?

热门文章

  1. iPhone开发入门(10)— 设备上运行程序
  2. 【 MATLAB 】sinc 函数简介
  3. 主元素问题(蒙特卡洛法和分治法)
  4. php pear pecl
  5. 联想杨元庆:向物联网转型已到关键时期
  6. 最新幼儿园老师工作计划
  7. 一些网站 http://ychun.w.googlepages.com/pages
  8. linux 取消混杂模式,linux 网卡的混杂模式的取消
  9. 字节番茄小说一面+二面+三面,本以为挂了,却意外收到offer
  10. 在Excel中插入Word文档(转)