3

我注意到,当我使用std::shared_ptr(或任何其他智能指针)时,自定义分配器/删除器是通过 ctor 分配的,它恰好是一个模板。我的问题是:分配器/删除器是如何存储和使用的?

这些函子是存储为函数指针void*,还是什么?是间接调用还是直接调用?

为了更清楚地了解我要问的内容,请考虑以下代码:

struct SomethingAwesomeDeleter
{
public:
    void operator()(SomethingAwesome* ptr) const
    {
        // do something awesome
        delete ptr;
    }
};
typedef std::shared_ptr<SomethingAwesome> SomethingAwesomePtr;

SomethingAwesomePtr ptr{new SomethingAwesome, SomethingAwesomeDeleter{}};

如何SomethingAwesomeDeleter{}存储和使用?

注意: 我确实意识到std::shared_ptr是一个模板类,但是std::shared_ptr在类模板参数中没有删除器/分配器的模板参数,即没有像std::shared_ptr<T, Allocator, Deleter>.

4

1 回答 1

3

您可以将任何函数对象存储在std::function. 这负责直接存储函数指针(如果它是普通函数)或将其包装在某个对象中。shared_ptr这是在函数类型不属于模板类型的情况下实现删除器的一种可能方式。

示例(未经测试,仅供参考)

// This is the struct which actually holds the shared pointer
// A shared_ptr would reference count this
template <typename T>
class shared_ptr_shared
{
    std::function<void (T*)> del_;
    T* p_;
    // other members

    template <typename Deleter>
    shared_ptr_shared (T* obj, Deleter deleter)
    : p_ (p)
    , del_ (deleter)
    {
    }

    ~shared_ptr_shared ()
    {
        if (del_) {
            del_ (p_);
        } else {
            delete p_;
        }
    }
};

您可以在此处找到有关 std::function 的更多信息:boost::function 和 boost::bind 的工作原理

于 2013-01-01T10:27:37.743 回答