【问题标题】:std::shared_ptr with custom deleter?带有自定义删除器的 std::shared_ptr?
【发布时间】:2021-09-03 07:25:27
【问题描述】:

我想实现一个object pool,所以需要自己管理对象的内存。于是想到自定义shared_ptr的deleter实现对象回收。以下是link的示例参考

    template <typename T>
    class object_pool
    {
        std::shared_ptr<tbb::concurrent_bounded_queue<std::shared_ptr<T>>> pool_;
    public:
        object_pool() 
        : pool_(new tbb::concurrent_bounded_queue<std::shared_ptr<T>>()){}

        // Create overloads with different amount of templated parameters.
        std::shared_ptr<T> create() 
        {         
              std::shared_ptr<T> obj;
              if(!pool_->try_pop(obj))
                  obj = std::make_shared<T>();

              // Automatically collects obj.
              return std::shared_ptr<T>(obj.get(), [=](T*){pool_->push(obj);}); 
        }
    };

问题

由于std::shared_ptr的deleter并没有释放内存,那么如何在“~object_pool”函数中释放内存呢?

【问题讨论】:

  • 池中的共享指针可能只是想成为标准删除器的普通共享指针。然后,您可以使用 create 中的自定义删除器将这些对象转移到新的共享指针

标签: c++ shared-ptr


【解决方案1】:

内存归std::shared_ptr&lt;T&gt; obj所有

返回的std::shared_ptr&lt;T&gt;(obj.get()确实不会显式删除对象,但是deleter lambda通过值捕获std::shared_ptr&lt;T&gt; obj,所以返回指针的删除器将拥有该对象,直到它被转移到pool_。

因此,内存要么由create() 中的std::shared_ptr&lt;T&gt; obj; 拥有,要么由pool_ 中的shared_ptr&lt;T&gt; 拥有。当pool_ 被清除时,它就会被释放。


shared_ptr 的使用在这里不是最理想的。看起来该示例是在采用 C++11 移动语义之前创建的。这可以重写,以便pool_ 和返回的指针删除器包含unique_ptr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多