C++ 如何创建自定义共享\u ptr?

C++ 如何创建自定义共享\u ptr?,c++,shared-ptr,destructor,smart-pointers,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") shared_p

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

Picture * pic;

pic=get_picture("directory/file")
我通过多个函数共享它。但是我想调用picture_close(pic)来对其进行去定位,只有当我完成并且所有这些函数都超出了范围时。shared_ptr已经做到了这一点,但如果我做到了:

shared_ptr<Picture> pic=get_picture("file")
shared_ptr pic=get_picture(“文件”)
它不会首先编译,因为函数get_picture返回一个指向图片的指针,而不是一个共享的\u ptr,当它超出范围时,它不会调用picture_close(pic),这是解除分配它的正确方法。是否有一种共享指针的自定义形式,只有在对该图片的所有引用都超出范围时才调用某种析构函数

如果我对一个对象执行操作并在其类的析构函数中调用picture\u close(pic),那么每当复制对象时,它就会调用析构函数并取消分配picture,这就是我所拥有的。

我想你是在问如何为
std::shared\u ptr
提供自定义删除功能,然后通过在其中附加预先分配的点来利用它。最常见的用法是一些预先存在的句柄类型API,它们需要这样的工作流

一种方法类似于下面的代码。我提供了
get\u picture
picture\u 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);
}

您可以了解有关创建和维护共享指针的各种机制的更多信息。顺便说一句,将该站点添加为书签;当你接触到越来越多的C++标准库时,这是你的战争库中的一个真正的资产。

是这里的简短版本,“我如何附加一个指针,要求一个自定义的DE分配函数,它的生存期由<代码> STD::SyrdypPTR < /C>?”it@Sprite我指的是类中的对象。类似向量。推回(obj);在这里,如果向量调整大小,它会改变位置,将所有内容复制到它的新地址,并为此对象调用析构函数。我不确定这是否清楚。我将用一些代码编辑这个问题。@Zeor137我只是误解了你的问题,很抱歉在你解释之前删除了它。你可以使用创建共享\u ptr。这种方法需要一段时间。在分配器实现中,您可以使用
get\u picture
picture\u close
进行创建和销毁。
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()