c++ - 如何创建自定义的shared_ptr?

标签 c++ shared-ptr destructor smart-pointers

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

Picture * pic;

pic=get_picture("directory/file")
我通过多个功能共享它。但是我只想在完成所有这些功能都超出范围后才调用picture_close(pic)对其进行分配。 shared_ptr已经做到了,但是如果我这样做:
shared_ptr<Picture> pic=get_picture("file")
它不会首先编译,因为函数get_picture返回指向Picture的指针而不是shared_ptr,并且当它超出范围时,它不会调用picture_close(pic),这是取消分配它的正确方法。是否有可能只有当对此图片的所有引用都超出范围时,共享指针的自定义形式才调用某种析构函数?
如果我做一个对象并在其类的析构函数中调用picture_close(pic),则每当复制对象时,它将调用析构函数并释放图片,这正是我所拥有的。

最佳答案

我认为您正在询问如何为std::shared_ptr提供自定义删除功能,然后通过在其中附加预分配的点来利用该功能。最常见的用法是需要这种工作流的一些预先存在的句柄类型的API。
一种方法是类似于以下代码。我提供了get_picturepicture_close的模拟版本,以及Picture类,但希望您能理解。

#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++标准库时,这是您的宝贵财富。

关于c++ - 如何创建自定义的shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64950098/

相关文章:

c++ - g++ : Is there a way to access compile flags inside the code that is being compiled?

c++ - 如何让 gdb tui 汇编输出显示指令?

c++ - 预编译头文件和预编译二进制文件有什么区别

c++ - 使用 std::shared_ptr 检测循环引用

c++ - 将派生类 shared_ptr 作为参数传递给需要基类 shared_ptr 的函数

c++ - 与当前 OpenGL 上下文对应的唯一 OpenCL 上下文

C++ 处理堆上的对象

c++ - C++ 中的列表析构函数

c++ - 当 SIGABRT 发生时,堆栈会被展开吗?

c++ - 当类包含空析构函数时有区别吗