唯一指针

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

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

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. Excel联动(wps)

    Excel联动(wps) https://www.wps.cn/learning/course/detail/id/330423.html demo: https://files.cnblogs.co ...

  2. Django多方式登录认证

    多方式认证原理 我们平常使用的Django登录认证是django.contrib.auth.authenticate 点进去源码,我们会看到这个函数,真正的认证类是它里面的那个 继续点进去源码,会看到 ...

  3. JVM运行时参数

    JVM运行时参数 JVM运行时参数是用于配置和调整Java虚拟机的行为和性能的参数.这些参数可以在启动Java应用程序时通过命令行或配置文件进行设置,合理配置参数可以使JVM虚拟机的达到更好的性能,降 ...

  4. 【Application Insights】使用CURL命令向Application Insgihts发送测试数据

    问题描述 在使用App Service或者Kubernetes等服务时,需要收集一些日志数据并且发送到Application Insights中,当使用SDK或者是服务自带的Application I ...

  5. 【Azure事件中心】使用Python SDK(Confluent)相关方法获取offset或lag时提示SSL相关错误

    问题描述 使用Python SDK(Confluent)相关方法获取offset或lag时, 提示SSL相关错误, 是否有更清晰的实例以便参考呢? 问题解决 执行代码,因为一直连接不成功,所以检查 c ...

  6. 代码随想录算法训练营第十三天| 239. 滑动窗口最大值 347.前 K 个高频元素 总结

    239. 滑动窗口最大值 (一刷至少需要理解思路) 卡哥建议:之前讲的都是栈的应用,这次该是队列的应用了.本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解. 题目链接/文章讲解/视频讲解 ...

  7. win上vscode配置ffmpeg

    参考博客https://blog.csdn.net/leixiaohua1020/article/details/38868499 https://blog.csdn.net/weixin_37515 ...

  8. Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)

    目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Little Girl and Maximum Sum 题意 给q个[l,r]将所有这些区间里面的数相加和最大. 可以进行的操作是任意排列数 ...

  9. 利用Nginx正向代理实现局域网电脑访问外网

    引言 在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的.这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx ...

  10. 新博客 VuejsDev.com 用于梳理知识点

    新博客 VuejsDev.com 用于梳理知识点 https://www.vuejsdev.com/ 后期没有精力发布了,迁移到博客园了,防止服务器到期~ [VueJsDev] 目录列表 https: ...