[英]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 返回一個指向 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()
您可以 在此處找到有關可以創建和維護共享指針的各種機制的更多信息。 順便說一句,將該網站加入書簽; 當您接觸到越來越多的 C++ 標准庫時,它是您戰爭中的真正資產。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.