【问题标题】:How to create an array of unique_ptrs with custom deleters?如何使用自定义删除器创建一个 unique_ptr 数组?
【发布时间】:2022-12-31 23:25:36
【问题描述】:

这是我所拥有的:

Demo

#include <cstdio>
#include <memory_resource>
#include <memory>
#include <string_view>
#include <array>
#include <utility> /* declval */


struct msg_outbound_t
{
    std::string_view hello_ = "Hello World!";
};

// Default deleter - works

// using msg_handle_t = std::unique_ptr<msg_outbound_t>;

// Custom deleter - doesn't work

using allocator_t = std::pmr::polymorphic_allocator<std::byte>;

auto pmr_deleter(allocator_t allocator) {
    return [allocator](msg_outbound_t* p) mutable { allocator.delete_object(p); };
}

using msg_handle_t = std::unique_ptr<msg_outbound_t, decltype(pmr_deleter(std::declval<allocator_t>()))>;


int main()
{
    std::array<msg_handle_t, 8> myarray;
}

它不起作用,因为似乎不能默认构造带有自定义删除器的 unique_ptr?是否有解决方法来创建它们的数组?

错误:

<source>:31:33: error: use of deleted function 'std::array<std::unique_ptr<msg_outbound_t, pmr_deleter(allocator_t)::<lambda(msg_outbound_t*)> >, 8>::array()'
   31 |     std::array<msg_handle_t, 8> myarray;
      |                                 ^~~~~~~

【问题讨论】:

    标签: c++ arrays unique-ptr default-constructor custom-deleter


    【解决方案1】:

    似乎不能默认构造带有自定义删除器的unique_ptr?

    是的,但是您必须提供一个可以实例化为模板参数的类:

    using allocator_t = std::pmr::polymorphic_allocator<std::byte>;
    
    struct pmr_deleter {
        void operator()(msg_outbound_t * p) {
             allocator.delete_object(p);
        }
        allocator_t allocator;
    };
    
    using msg_handle_t = std::unique_ptr<msg_outbound_t, pmr_deleter>;
    

    Demo

    【讨论】:

    • 好吧,我在想我是通过提供一个 lambda 来做到这一点的吗?但是现在您已经省略了分配器的关闭。我得到两者是不可能的?我的意思是默认构造的 unique_ptr 甚至不必删除任何东西,所以我不明白为什么首先要删除它。
    猜你喜欢
    • 2015-08-13
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-10-10
    • 2017-06-01
    相关资源
    最近更新 更多