簡體   English   中英

如何創建自定義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 返回一個指向 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()

您可以 在此處找到有關可以創建和維護共享指針的各種機制的更多信息。 順便說一句,將該網站加入書簽; 當您接觸到越來越多的 C++ 標准庫時,它是您戰爭中的真正資產。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM