智能指针unique_ptr的使用

定义

template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
template <class T, class Deleter> 
class unique_ptr<T[], Deleter>;

std::unique_ptr 是通过指针占有并管理另一对象, 并在unique_ptr离开作用域时释放该对象的智能指针。

释放对象的时机-> :

  1. 销毁了管理的unique_ptr对象
  2. 通过operator=reset() 赋值另一指针给管理的 unique_ptr对象

也可以通过调用get_deleter()(ptr) 删除对象;

unique_ptr 是可以转义对象的管理权的,但是被const修饰之后就不能够被转移了

常用的成员函数

函数名字 作用
operator= 赋值
reset 替换被管理对象
swap 交换被管理对象
release 返回被管理对象的指针,并且释放一个对象所有权
get 返回被管理对象的指针

常用的非成员函数

函数名字 作用
make_unique 创建一个管理对象的独占指针
std::swap(std::unique_ptr) 特化 std::swap 算法

示例代码

struct Base {
    // 创建一个虚函数
    virtual void bar() { std::cout << "Base::bar()\n"; }
    virtual ~Base() = default;
    
    std::string val;
};

struct Derived : Base {
    Derived() { std::cout << "Derived::Constructor\n"; }
    ~Derived() { std::cout << "Derived::Descontructor\n"; }
    void bar() override { std::cout << "Derived::bar()\n"; }

    std::string val;
};

int main()
{
    std::cout << "\nunique_ptr 指向对象的所有权的测试---->\n";
    {
        // ptr_Derived拥有对象的所有权
        auto ptr_Derived = std::make_unique<Derived> ();
        ptr_Derived->val = "unique_ptr";
        auto ptr_MoveD = std::move(ptr_Derived);    //ptr_Derived 不在拥有对象所有权

        assert(!ptr_Derived);    //ptr_Derived为empty
        ptr_MoveD->bar();
        std::cout << ptr_MoveD->val << std::endl;
        // 这里将会调用一次Derived的析构函数
    }

    std::cout << "\n多态运行时测试----->\n";
    {
        std::unique_ptr<Base> p_base = std::make_unique<Derived>();    // p_base是指向基类的指针,但是占有D的unique_ptr
        p_base->bar();    // 这里将调用的Derived的bar函数

        std::vector<std::unique_ptr<Base>> v;    // 容器也可以存储unique_ptr对象

        v.push_back(std::move(p_base));
        v.push_back(std::make_unique<Derived>());
        v.emplace_back(new Derived);

        for (auto& itr : v)
        {
            itr->bar();
        }

        // 这里将调用3次析构函数 
    }

    std::cout << "\n数组形式的unique_str对象测试--->\n";
    {
        std::unique_ptr<Derived[]> parr{ new Derived[4] };
        // 这里将调用4次析构函数
    }
    return 0;
}

运行结果

unique_ptr 指向对象的所有权的测试---->
Derived::Constructor
Derived::bar()
unique_ptr
Derived::Descontructor

多态运行时测试----->
Derived::Constructor
Derived::bar()
Derived::Constructor
Derived::Constructor
Derived::bar()
Derived::bar()
Derived::bar()
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor

数组形式的unique_str对象测试--->
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor

作者:醉曦
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   醉曦  阅读(708)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示