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
的所有权被转移到 myPtr2
,myPtr1
变为 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
。