【问题标题】:How to create a custom shared_ptr?如何创建自定义 shared_ptr?
【发布时间】:2020-11-22 02:24:44
【问题描述】:

假设我有一个库 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 终身维护的指针?”
  • @WhozCraig 是的,就是这样
  • @Sprite 我的意思是有一个类的对象。像 Vector.push_back(obj);在这里,如果向量调整大小,它会更改位置,将所有内容复制到它的新地址并调用该对象的析构函数。我不确定这是否清楚。我将用一些代码编辑问题。
  • @Zeor137 我只是误解了你的问题,抱歉在你解释之前我已经删除了。
  • 您可以使用allocate_shared创建shared_ptr。这个方法需要一个Allocator。在您的分配器实现中,您可以使用get_picturepicture_close 进行创建和销毁。

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


【解决方案1】:

认为您问的是如何为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++ 标准库,它会成为您战争中的真正资产。

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2014-08-05
    • 2015-12-08
    • 2016-07-10
    • 2011-12-29
    • 2017-03-12
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多