unique_ptr是C++11中引入的一种智能指针,主要用于管理动态分配的内存,并能够自动释放它所管理的资源。与传统的指针不同,unique_ptr的所有权是独占的,即同一时间内只能有一个unique_ptr指向同一块内存,因此它不能被复制,只能通过移动(move)语义来转移所有权。
unique_ptr的主要用法如下:
目录
1、管理动态分配的内存
unique_ptr可以管理动态分配的内存,当unique_ptr超出作用域或被删除时,它所管理的内存会被自动释放。以下是一个示例:
std::unique_ptr<int> ptr(new int(42));
这将在堆上分配一个int类型的内存并将其初始化为42,unique_ptr将管理这个内存,并在其生命周期结束时自动释放。
2、避免内存泄漏
由于unique_ptr的自动释放特性,它可以避免因忘记释放内存而导致的内存泄漏。以下是一个示例:
void function()
{
std::unique_ptr<int> ptr(new int(42));
// do something
return; // ptr会自动释放内存
}
当函数结束时,unique_ptr对象会自动被销毁,并释放它所管理的内存。
3、不允许复制,只能移动
unique_ptr的所有权是独占的,因此不能被复制,只能通过移动语义来转移所有权。以下是一个示例:
std::unique_ptr<int> ptr1(new int(42));
std::unique_ptr<int> ptr2 = std::move(ptr1);
通过std::move()函数,ptr1的所有权被移动到ptr2中,ptr1不再拥有所管理的内存。这样做可以避免因意外地复制unique_ptr而导致的内存错误。
4、支持自定义删除器
unique_ptr支持自定义删除器,可以在释放内存时执行自定义的清理操作。以下是一个示例:
void my_deleter(int* ptr)
{
// do some clean-up
delete ptr;
}
std::unique_ptr<int, decltype(&my_deleter)> ptr(new int(42), &my_deleter);
在这个例子中,我们定义了一个名为my_deleter的函数,它将在unique_ptr释放内存时被调用。unique_ptr的第二个模板参数指定了删除器的函数类型,此处使用了函数指针。在unique_ptr的构造函数中,我们将my_deleter指针传递给unique_ptr,以便在释放内存时执行清理操作。
总之,unique_ptr通过自动管理内存和禁止复制等特性,可以帮助程序员更轻松地管理动态分配的内存,并且通过支持自定义删除器,可以实现更灵活的内存管理。