如何创建自定义 shared_ptr?

How to create a custom shared_ptr?

假设我有一个 SXY 库,它从一个文件中给我一张图片:

Picture * pic;

pic=get_picture("directory/file")

并且我通过多个函数共享它。但是我只想调用 picture_close(pic) 来分配它,只有当我完成并且所有这些函数都超出了范围时。 shared_ptr 已经这样做了,但如果我这样做:

shared_ptr<Picture> pic=get_picture("file")

它不会首先编译,因为函数 get_picture returns 是指向图片的指针而不是 shared_ptr,当它超出范围时它不会' t 调用 picture_close(pic) 这是释放它的正确方法。是否有一种自定义形式的共享指针仅在对这张图片的所有引用都超出范围时才调用某种析构函数?

如果我做一个对象并在它的 class 的析构函数中调用 picture_close(pic) 它会调用析构函数并在对象被复制时释放图片,这就是我有.

认为 您在询问如何为 std::shared_ptr 提供自定义删除器功能,然后通过在其中附加您的预分配点来利用它。最常见的用途是一些需要此类工作流的预先存在的句柄类型 API。

一种方法就像下面的代码。我提供了 get_picturepicture_close 的模拟版本,以及 Picture class,但希望你能理解。

#include <iostream>
#include <vector>
#include <memory>

struct Picture
{
    Picture() { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    virtual ~Picture() { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    
    void report() { std::cout << "report!\n"; }
};

Picture *get_picture()
{
    return new Picture();
}

void picture_close(Picture *p)
{
    std::cout << "deleting picture\n";
    delete p;
}

void foo(std::vector<std::shared_ptr<Picture>> pictures)
{
    for (auto& sp : pictures)
        sp->report();
}

int main()
{
    std::vector<std::shared_ptr<Picture>> pictures;
    for (int i=0; i<5; ++i)
        pictures.emplace_back(get_picture(), picture_close);
    foo(pictures);
}

输出

Picture::Picture()
Picture::Picture()
Picture::Picture()
Picture::Picture()
Picture::Picture()
report!
report!
report!
report!
report!
deleting picture
virtual Picture::~Picture()
deleting picture
virtual Picture::~Picture()
deleting picture
virtual Picture::~Picture()
deleting picture
virtual Picture::~Picture()
deleting picture
virtual Picture::~Picture()

您可以详细了解可以创建和维护共享指针的各种机制 here。顺便说一句,将该站点添加为书签;当您接触到越来越多的 C++ 标准库时,它是您 war 胸中的一笔真正的财富。