C++简单实现unique_ptr

Posted 放飞梦想C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++简单实现unique_ptr相关的知识,希望对你有一定的参考价值。

唯一指针

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

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

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的主要内容,如果未能解决你的问题,请参考以下文章

C++ Qt std::unique_ptr Qt 版本在哪里?

C++:通过引用 unique_ptr 对象使 unique_ptr 为空

C++ unique_ptr介绍及仿写

C++进阶---智能指针

C++进阶---智能指针

C++ 11 创建和使用 unique_ptr