C++11之智能指针unique_ptr

std::unique_ptr 是 C++ 标准库中的智能指针类,用于管理动态分配的对象。它提供了独占式拥有权,即在任何时候只能有一个 std::unique_ptr 拥有对对象的唯一所有权。当 std::unique_ptr 被销毁或重置时,它会自动删除所管理的对象,从而避免内存泄漏。

std::unique_ptr 的主要特点和用法如下:

  1. 独占式所有权:一个 std::unique_ptr 实例拥有对对象的唯一所有权,不能拷贝或共享所有权。这意味着只能有一个 std::unique_ptr 实例指向同一个对象,从而避免了资源的多重释放和访问冲突。

  2. 托管动态分配的对象:std::unique_ptr 主要用于托管通过 newstd::make_unique 动态分配的对象。它可以管理任何可删除的对象,包括基本类型、自定义类型和数组等。

  3. 自动释放资源:当 std::unique_ptr 被销毁或重置时,它会自动调用所管理对象的析构函数,并释放对象所占用的内存。这消除了手动管理资源释放的需求,提高了代码的可靠性和安全性。

  4. 移动语义:std::unique_ptr 支持移动语义,可以通过移动构造函数和移动赋值运算符将所有权从一个 std::unique_ptr 实例转移给另一个实例,从而避免不必要的对象拷贝和资源释放。

一、unique_ptr初始化

复制代码
#include <iostream>
#include <memory>

class UniquePtr {
public:
    UniquePtr() { std::cout << "调用构造函数" << std::endl; }
    ~UniquePtr() { std::cout << "调用析构函数" << std::endl; }
    void print() { std::cout << "调用print()函数" << std::endl; }
};

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    ptr->print();

    return 0;
}
复制代码

二、无法进行复制构造和赋值操作

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    std::unique_ptr<UniquePtr> ptr1(ptr); //报错
    std::unique_ptr<UniquePtr> ptr2 = ptr; //报错
   
    return 0;
}

三、可以进行移动构造和移动赋值操作

unique_ptr虽然没有拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。如果需要转移所有权,可以使用std::move()函数。

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    std::unique_ptr<UniquePtr> ptr2 = std::move(ptr); //转移所有权
    std::unique_ptr<UniquePtr> ptr3(std::move(ptr));
   
    return 0;
}

四、可以通过函数返回值返回unique_ptr

复制代码
#include <iostream>
#include <memory>

class UniquePtr {
public:
    UniquePtr() { std::cout << "调用构造函数" << std::endl; }
    ~UniquePtr() { std::cout << "调用析构函数" << std::endl; }
    void print() { std::cout << "调用print()函数" << std::endl; }
};

std::unique_ptr<UniquePtr> return_unique_ptr() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());

    return ptr;
}

int main() {
    std::unique_ptr<UniquePtr> ptr = return_unique_ptr();
   
    return 0;
}
复制代码

 

posted @   TechNomad  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示