手写独立指针

/// author: Tang Guofang
/// date: 2023-07-05
/// description:
/// 手写独立指针,主要包含删除器和指针两个成员变量。
/// 其他的就是常规的构造函数、拷贝构造函数与赋值函数,析构函数,重载*和->操作符。
#include <iostream>

/// @brief 删除器
/// @tparam T 模板类型
template <typename T>
class DefaultDeleter {
public:
    /// @brief 仿函数,功能为重置形参目标
    /// @param ptr 传入的指针,也是被删除的指针
    void operator()(T* ptr) {
        if (ptr) {
            delete ptr;
            ptr = nullptr;
        }
    }
};

/// @brief 手写独立指针
/// @tparam T 模板类型
/// @tparam Deleter 删除器,默认为DefaultDeleter
template <typename T, typename Deleter = DefaultDeleter<T>>
class unique_ptr {
private:
    /// @brief 实际指针
    T* ptr_;
    /// @brief 删除器的实例
    Deleter del_;

public:
    /// @brief 构造函数
    /// @param ptr 传入的指针,默认为空指针
    explicit unique_ptr(T* ptr = nullptr) : ptr_(ptr) {}
    /// @brief 拷贝构造函数,禁止拷贝构造
    /// @param p 传入的指针
    unique_ptr(const unique_ptr& p) = delete;
    /// @brief 赋值函数,禁止赋值
    /// @param p 传入的指针
    /// @return unique_ptr&
    unique_ptr& operator=(const unique_ptr& p) = delete;
    unique_ptr(unique_ptr&& p) : ptr_(p.ptr_) { p.ptr_ = nullptr; }
    unique_ptr& operator=(unique_ptr&& p) {
        std::swap(this->ptr_, p.ptr_);
        p.ptr_ = nullptr;
    }
    /// @brief 常规的*和->操作符
    /// @return T& T* 引用与指针
    T& operator*() { return *ptr_; }
    T* operator->() { return ptr_; }
    /// @brief 布尔返回,判断指针是否为空
    operator bool() const { return ptr_ != nullptr; }
    /// @brief 常规的get函数
    /// @return T* 指针
    T* get() const { return ptr_; }
    /// @brief 释放指针,并返回实际指针
    /// @return T* 实际指针
    T* release() {
        T* pointer = ptr_;
        ptr_       = nullptr;
        return pointer;
    }
    /// @brief 重置指针
    /// @param ptr 传入的指针
    void reset(T* ptr) {
        unique_ptr<T, Deleter>().swap(*this);
        ptr_ = ptr;
    }
    /// @brief 交换指针
    /// @param p 传入的指针
    void swap(unique_ptr& p) { std::swap(ptr_, p.ptr_); }

#if use_deleter
    /// @brief 析构函数,调用删除器
    ~unique_ptr() { del_(ptr_); }
#else
    /// @brief 析构函数,不调用删除器
    ~unique_ptr() {
        if (ptr_ != nullptr) {
            delete ptr_;
            ptr_ = nullptr;
        }
    }
#endif
};

int main() {
    unique_ptr<int> unq_ptr(new int(10));
    unique_ptr<int> unq_ptr2 = std::move(unq_ptr);
    printf("unq_ptr2: %d\n", *unq_ptr2);
    unique_ptr<int> unq_ptr3(std::move(unq_ptr2));
    printf("unq_ptr3: %d\n", *unq_ptr3);
    std::cout << unq_ptr.get() << std::endl;
    std::cout << unq_ptr2.get() << std::endl;
    std::cout << unq_ptr3.get() << std::endl;
    if (unq_ptr) {
        printf("unq_ptr: %d\n", *unq_ptr);
    } else {
        printf("unq_ptr is nullptr\n");
    }
}

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注