假设我有一个库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_picture
和picture_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/