unique_ptr通过指针占有并管理另一个对象(主要负责管理对象的销毁,或者说生命周期)。当unique_ptr被销毁时或者给unique_ptr赋值另一个对象的指针时,unique_ptr将删除原来管理的对象。unique_ptr可以管理单个对象,也可以管理动态分配的对象数组。unique_ptr类满足可移动构造以及可移动赋值,但是不满足可复制构造和可复制赋值的要求。
代码库:
https://gitee.com/gamestorm577/CppStd
创建unique_ptr
一般通过std::make_unique来创建一个unique_ptr。
例如创建一个管理单个类对象的unique_ptr:
struct MyStruct
{
MyStruct()
{
printf("MyStruct1, {X: %d, Y: %d}\n", X, Y);
}
MyStruct(int x, int y)
: X(x)
, Y(y)
{
printf("MyStruct2, {X: %d, Y: %d}\n", X, Y);
}
int X = 0;
int Y = 0;
};
std::cout << "construct a unique_ptr of single object: " << std::endl;
std::unique_ptr<MyStruct> ptr1 = std::make_unique<MyStruct>();
std::cout << "construct a unique_ptr of single object: " << std::endl;
std::unique_ptr<MyStruct> ptr2 = std::make_unique<MyStruct>(3, 5);
终端输出结果为:
construct a unique_ptr of single object:
MyStruct1, {X: 0, Y: 0}
construct a unique_ptr of single object:
MyStruct2, {X: 3, Y: 5}
也可以创建一个管理动态分配的对象数组的unique_ptr:
std::cout << "construct a unique_ptr of object array: " << std::endl;
std::unique_ptr<MyStruct[]> ptr3 = std::make_unique<MyStruct[]>(3);
终端输出结果为:
construct a unique_ptr of object array:
MyStruct1, {X: 0, Y: 0}
MyStruct1, {X: 0, Y: 0}
MyStruct1, {X: 0, Y: 0}
对象生命周期管理
智能指针的主要功能是管理对象的生命周期。对于一个动态分配的对象,当我们不需要时,需要手动删除这个对象,这种手动管理的方式非常容易犯错。unique_ptr是一个栈上的变量,它的内存申请和回收都是系统自动完成的。通过unique_ptr来管理动态分配的对象的生命周期,当unique_ptr被销毁时,自动删除其占用的对象,这样更智能,不容易犯错。
例如,当unique_ptr离开作用域时,unique_ptr被销毁,unique_ptr管理的对象被自动删除:
struct MyStruct
{
~MyStruct()
{
printf("~MyStruc