c++智能指针unique_ptr的使用

1. 基本使用

std::unique_ptr 是一个模板类,提供了对动态分配内存的独占所有权。它确保同一时间只有一个 unique_ptr 拥有对对象的指针。当 unique_ptr 被销毁时(例如,超出作用域或被显式删除),它所指向的对象也会被自动删除。

创建 unique_ptr

使用 std::make_unique 函数是创建 unique_ptr 的推荐方式,因为它可以减少代码量,避免直接使用 new 操作符的潜在错误,并提供异常安全保证。

#include <memory>

std::unique_ptr<MyClass> myPtr = std::make_unique<MyClass>();

如果你的编译器不支持 C++14 中的 std::make_unique,你可以直接使用 new 来创建 unique_ptr

std::unique_ptr<MyClass> myPtr(new MyClass());
访问 unique_ptr 指向的对象

你可以使用 ->* 操作符来访问 unique_ptr 所指向的对象。

myPtr->myMethod();
(*myPtr).myMethod();

2. 转移所有权

unique_ptr 的一个关键特性是它不允许复制,确保对象的独占所有权。但是,你可以转移一个 unique_ptr 的所有权给另一个 unique_ptr,这通过 std::move 函数实现。

std::unique_ptr<MyClass> myPtr1 = std::make_unique<MyClass>();
std::unique_ptr<MyClass> myPtr2 = std::move(myPtr1);

在上面的代码中,myPtr1 的所有权被转移到 myPtr2myPtr1 变为 nullptr

3. 自定义删除器

默认情况下,unique_ptr 使用 delete 来销毁其所指向的对象。但是,你可以提供一个自定义删除器,以支持特殊的销毁逻辑。

#include <memory>
#include <iostream>

struct MyDeleter {
    void operator()(MyClass* ptr) {
        std::cout << "Custom delete for MyClass." << std::endl;
        delete ptr;
    }
};

std::unique_ptr<MyClass, MyDeleter> myPtr(new MyClass(), MyDeleter());

4. 与数组一起使用

unique_ptr 也可以管理动态分配的数组。为此,你需要在对象类型后面加上 []

std::unique_ptr<MyClass[]> myArray = std::make_unique<MyClass[]>(5);

这里,myArray 是一个指向由 5 个 MyClass 实例组成的数组的 unique_ptr。数组的每个元素都会被默认构造。

总结

std::unique_ptr 是现代 C++ 中管理动态分配内存的首选方式。它通过自动管理生命周期,减少内存泄漏的风险,同时提供了灵活的所有权转移机制。希望这些信息能帮助你更好地理解和使用 std::unique_ptr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值