欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

modern effective C++ 18

程序员文章站 2024-02-29 07:58:22
...

1.概述
该条款是关于智能指针的,unique_ptr主要用来管理互斥的资源,经常用来对C++中的强聚合关系建模,一个类可以把另外一个类当做成员,这样两个类的生命周期完全相同,大类完全掌控了小类的构造和析构,但是该类的内存需求相对较大,可以采用指针来管理类的成员函数,使用RAII在构造中new 在析构时delete,同样可以使用unique_ptr在构造时分配,当类生命周期结束时,会自动调用析构函数而不需要手动的写delete语句,更加安全。
2.
有一个例子,在函数中返回一个在堆上分配的内存,如果不使用智能指针,用户则需要手动delete。
unique_ptr的内存大小与普通指针大小相当,但是当使用用户给定的删除器时,内存消耗会相应变大。
猜想主要用途时兼容C代码,C没用析构的概念,一般都是通过函数调用来释放结构体资源。比如说函数
event_base_new() 和event_base_free()分别申请和释放某个结构体,这样就可以定义一个只能

#include <event2/event.h>
#include <memory>
int main()
{
    auto deleter = [](event_base* base)
    {
        printf("deleter\n");
        event_base_free(base);
    };
    std::unique_ptr<event_base,decltype(deleter)> ptr(event_base_new(),deleter);

}

只是个人认为一种可能的用法。

unique_ptr不支持拷贝,只支持移动。
reset 和 移动拷贝都会造成指针指向的内存被回收,如果原来的指针不为空的话。
可以很方便地把unique_ptr转为shared_ptr 。