唯一指针

管理指针的存储,提供有限的垃圾回收工具,与内置指针相比几乎没有开销(取决于所使用的删除程序)。

这些对象具有获取指针所有权的能力:一旦它们获得所有权,它们就会通过在某个时候负责删除指向的对象来管理指向的对象。

unique_ptr对象在它们本身被销毁时,或者一旦它们的值通过赋值操作或显式调用unique_ptr::reset而改变,就会自动删除它们所管理的对象(使用删除器)。

unique_ptr对象唯一地拥有其指针:任何其他工具都不应负责删除该对象,因此任何其他托管指针都不应指向其托管对象,因为一旦它们必须这样做,unique_ptr对象就会删除其托管对象,而不考虑其他指针是否仍指向同一对象, 从而将指向那里的任何其他指针保留为指向无效位置。

unique_ptr对象有两个组件:

  • 存储的指针:指向它所管理的对象的指针。这是在构造时设置的,可以通过赋值操作或调用成员重置进行更改,并且可以单独访问以使用成员获取或释放进行读取。
  • 存储的删除程序:一个可调用对象,它采用与存储指针类型相同的参数,并被调用以删除托管对象。它在施工时设置,可以通过分配操作进行更改,并且可以使用成员get_deleter单独访问。

unique_ptr对象通过运算符 * 和 ->(对于单个对象)或运算符 [](对于数组对象)提供对其托管对象的访问来复制有限的指针功能。出于安全原因,它们不支持指针算术,仅支持移动分配(禁用复制分配)

成员函数

	(构造函数)构造unique_ptr(公共成员函数)
(析构函数)销毁unique_ptr(公共成员函数)
operator= unique_ptr赋值(公共成员函数)
get 获取指针(公共成员函数)
get_deleter 获取存储的删除程序(公共成员函数)
operator bool 检查是否不为空(公共成员函数)
release 释放指针(公共成员函数)
reset 重置指针(公共成员函数)
swap 交换内容(公共成员函数) 非专用版本(单个对象)独占:
operator* 取消引用对象(公共成员函数)
operator-> 取消引用对象成员(公共成员函数) 专用于具有运行时长度的数组的版本:
operator[] 偏移访问(公共成员函数) 非成员函数重载
swap 交换unique_ptr对象的内容(函数模板)
relational operators 关系运算符 ==, !=, <, <=, >, >= (函数模板)

cpp

#include <utility>
#include <stddef.h> template <typename T>
class Unique_ptr
{
public:
constexpr Unique_ptr() noexcept = default;
constexpr Unique_ptr(nullptr_t) noexcept : Unique_ptr() {}
explicit Unique_ptr(T *ptr) noexcept : ptr_{ptr} {}
Unique_ptr(const Unique_ptr &) = delete; // unique_ptr的特性不允许拷贝
Unique_ptr(Unique_ptr &&rhx) noexcept : ptr_{rhx.release()} {} ~Unique_ptr() noexcept
{
delete ptr_;
} Unique_ptr &operator=(const Unique_ptr &) = delete; // unique_ptr的特性不允许拷贝
constexpr Unique_ptr &operator=(nullptr_t)
{
this->reset();
return *this;
}
Unique_ptr &operator=(Unique_ptr &&rhx) noexcept
{
this->reset(rhx.release());
return *this;
} T *release() noexcept
{
return std::exchange(ptr_, nullptr); //返回当前指针指向地址,并置当前指针为空
}
T *get() const noexcept
{
return ptr_;
}
void reset(T *ptr) noexcept
{
delete std::exchange(ptr_, ptr); //释放当前指针指向地址内存并传入新的的地址内存
}
void swap(Unique_ptr &rhx) noexcept
{
std::swap(ptr_, rhx.ptr_);
} T &operator*() const
{
return *ptr_;
}
T *operator->() const noexcept
{
return ptr_;
}
operator bool() const noexcept
{
return static_cast<bool>(ptr_);
} private:
T *ptr_{nullptr};
}; template <typename T, typename... Args>
auto make_Unique(Args &&...args)
{
return Unique_ptr<T>{new T(std::forward(args)...)};
}
#include <vector> int main()
{
Unique_ptr<std::vector<int>> ptr = make_Unique<std::vector<int>>();
return 0;
}

C++简单实现unique_ptr的更多相关文章

  1. Clang编译选项和Pass构建

    编译选项相关: 想要添加的选项,以我添加的-fdpu为例子 能通过clang --help得到的选项,整体需要一个解析文件(好像在LLVM项目中都是通过后缀名为xxx.td和xxx.def的文件来进行 ...

  2. C++智能指针简单剖析

    导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...

  3. shared_ptr 和 unique_ptr

    c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你 ...

  4. C++11 智能指针unique_ptr使用 -- 以排序二叉树为例

    用智能指针可以简化内存管理.以树为例,如果用普通指针,通常是在插入新节点时用new,在析构函数中调用delete:但有了unique_ptr类型的智能指针,就不需要在析构函数中delete了,因为当u ...

  5. 智能指针(三):unique_ptr使用简介

    我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...

  6. [转] 智能指针(三):unique_ptr使用简介

    PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...

  7. unique_ptr简谈

    看到文章里的同学留言说到unique_ptr,这两天看了一下cplusplus提供的reference才知道这个东西是c++11的新特性,对c++11的新特性不是很了解,花时间了解了下unique_p ...

  8. 【转】C++智能指针简单剖析

    原文链接:http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看 <C++ Primer Plus>第六版,这的确是本好书 ...

  9. 《Effective Modern C++》翻译--简单介绍

    北京时间2016年1月9日10:31:06.正式開始翻译.水平有限,各位看官若有觉得不妥之处,请批评指正. 之前已经有人翻译了前几个条目,有些借鉴出处:http://www.cnblogs.com/m ...

  10. C++智能指针及其简单实现

    本文将简要介绍智能指针shared_ptr和unique_ptr,并简单实现基于引用计数的智能指针. 使用智能指针的缘由 1. 考虑下边的简单代码: int main() { ); ; } 就如上边程 ...

随机推荐

  1. Innodb存储引擎的文件

    目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...

  2. C++ 多线程的错误和如何避免(4)

    对共享的资源或者数据做加锁处理 在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为. 比如: #include <iostream> #in ...

  3. 【Azure API 管理】API Management service (APIM) 如何实现禁止外网访问

    问题描述 API Management service 设置禁止外网访问,请求通过外网(Internet)将无法解析到APIM的网关地址,只能通过APIM所集成的内网(Virtual Network) ...

  4. docker使用 mysql8

    # docker pull mysql:8 # mkdir -p /mysql/{datadir,etc/mysql} # cat >/mysql/etc/mysql/my.cnf <&l ...

  5. 3.1蓝桥杯每日知识点,全排列permutation

    next_permutation()函数 适用于生成当前序列的下一个排列 如果存在下一个排列,则将当前序列更改为下一个排列,并返回true 如果当前序列已经是最后一个排列,则将序列更改为第一个排列,并 ...

  6. 摆脱鼠标操作 - vscode - vim Ctrl + hjkl 我定位为 上下翻半页和行头行尾

    为什么 摆脱鼠标操作 - vscode - vim Ctrl + hjkl 我定位为 上下翻半页和行头行尾 翻页和当前行的开头结尾 我觉得都是高频操作 实现 settings.json 还附加了几个其 ...

  7. VS Code Snippet Generator 插件 生成 vscode代码片段

    VS Code Snippet Generator 插件 生成 vscode代码片段

  8. redis三主三从详细搭建过程

    搭建Redis三主三从集群的详细步骤如下: 准备环境: 确保你有六台服务器或虚拟机,每台服务器上都已经安装了Redis.这些服务器将用于搭建三主三从的Redis集群. 确保所有服务器之间的网络连接正常 ...

  9. PV的回收策略、访问策略和状态

    PersistentVolume(PV)的回收策略.访问策略和状态是Kubernetes存储管理中的重要概念. 回收策略 Retain:当PV的回收策略设置为Retain时,即使对应的Persiste ...

  10. Github账号开启账号双重验证

    原文: Github开启双重验证 - Stars-One的杂货小窝 今天在浏览开源项目的时候,突然Github有个提示我要在9月18日前开启双重验证,说是不完成的话,到时候的Github账号会受到限制 ...