当前位置: 首页 > 知识库问答 >
问题:

使用d::allocate_shared多态资源分配器

万喜
2023-03-14

我试图用std::pmr::monotonic\u buffer\u资源创建共享指针,但我无法使其编译。我错过了什么?

https://godbolt.org/z/R9jdju

#include <memory>
#include <memory_resource>

int main() {
    char buffer[100];
    std::pmr::monotonic_buffer_resource mbr(buffer, 100);
    std::shared_ptr<double> sp = std::allocate_shared<double>(mbr);
}
In file included from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/ext/alloc_traits.h:34,
                 from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/stl_uninitialized.h:67,
                 from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/memory:66,
                 from <source>:1:
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/alloc_traits.h: In substitution of 'template<class _Alloc, class _Up> using __alloc_rebind = typename std::__allocator_traits_base::__rebind<_Alloc, _Up>::type [with _Alloc = std::pmr::monotonic_buffer_resource; _Up = std::_Sp_counted_ptr_inplace<double, std::pmr::monotonic_buffer_resource, __gnu_cxx::_S_atomic>]':
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:542:13:   required from 'class std::_Sp_counted_ptr_inplace<double, std::pmr::monotonic_buffer_resource, __gnu_cxx::_S_atomic>'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:679:43:   required from 'std::__shared_count<_Lp>::__shared_count(_Tp*&, std::_Sp_alloc_shared_tag<_Alloc>, _Args&& ...) [with _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:1371:71:   required from 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; _Tp = double; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:408:59:   required from 'std::shared_ptr<_Tp>::shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; _Tp = double]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:859:14:   required from 'std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}]'
<source>:7:66:   required from here
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/alloc_traits.h:78:11: error: no type named 'type' in 'struct std::__allocator_traits_base::__rebind<std::pmr::monotonic_buffer_resource, std::_Sp_counted_ptr_inplace<double, std::pmr::monotonic_buffer_resource, __gnu_cxx::_S_atomic>, void>'
   78 |     using __alloc_rebind
      |           ^~~~~~~~~~~~~~
In file included from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:52,
                 from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/memory:84,
                 from <source>:1:
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h: In instantiation of 'std::__shared_count<_Lp>::__shared_count(_Tp*&, std::_Sp_alloc_shared_tag<_Alloc>, _Args&& ...) [with _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]':
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:1371:71:   required from 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; _Tp = double; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:408:59:   required from 'std::shared_ptr<_Tp>::shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; _Tp = double]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:859:14:   required from 'std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}]'
<source>:7:66:   required from here
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:682:16: error: use of deleted function 'std::pmr::monotonic_buffer_resource::monotonic_buffer_resource(const std::pmr::monotonic_buffer_resource&)'
  682 |    auto __pi = ::new (__mem)
      |                ^~~~~~~~~~~~~
  683 |      _Sp_cp_type(__a._M_a, std::forward<_Args>(__args)...);
      |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from <source>:2:
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/memory_resource:604:5: note: declared here
  604 |     monotonic_buffer_resource(const monotonic_buffer_resource&) = delete;
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr.h:52,
                 from /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/memory:84,
                 from <source>:1:
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:546:33: note:   initializing argument 1 of 'std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc, _Args&& ...) [with _Args = {}; _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]'
  546 |  _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
      |                          ~~~~~~~^~~

共有1个答案

申屠宏胜
2023-03-14

这条长错误消息基本上可以归结为以下两个错误:

错误:在'结构std::__allocator_traits_base::__rebind中没有名为'type'的类型

错误:使用已删除的函数d::pmr::monotonic_buffer_resource::monotonic_buffer_resource(constd::pmr::monotonic_buffer_resource

std::pmr::monotonic_buffer_resource不满足std::allocate_shared()期望的要求,具体来说:

所有内存分配都是使用alloc的副本完成的,该副本必须满足分配器的要求。

特别是,"a COPY ofalloc"失败,因为monotonic_buffer_resource的复制构造函数是delete'd,因此无法复制。

正如@MilesBudnek在注释中所述,您可以将单调缓冲区资源封装在一个多态分配器中,该分配器被设计为标准容器的分配器:

类模板std::pmr::polymorphic_allocator是一个Allocator,它根据构造它的std::pmr::memory_resource表现出不同的分配行为。

例如:

#include <memory>
#include <memory_resource>

int main() {
    char buffer[100];
    std::pmr::monotonic_buffer_resource mbr(buffer, 100);
    auto sp = std::allocate_shared<double, std::pmr::polymorphic_allocator<double>>(&mbr);
}

https://godbolt.org/z/-xFfFY

或者:

#include <memory>
#include <memory_resource>

int main() {
    char buffer[100];
    std::pmr::monotonic_buffer_resource mbr(buffer, 100);
    std::pmr::polymorphic_allocator<double> alloc(&mbr);
    auto sp = std::allocate_shared<double>(alloc);
}

https://godbolt.org/z/GLE4-5

 类似资料:
  • 我试图动态地获取给定数量的资源,但我无法理解语法。在资源集动态分配中,每个单元由其所属的资源集的名称表示。在图中,查封块将查封集合“resourcePool”中的3个资源。 我需要为每一个特工抓取特定数量的资源。然后我尝试创建资源池对象的ArrayList,并将其传递到动态分配中,但由于类型不匹配,因此无法工作。 例如,假设我有一个需要4个资源的代理,所以需要的表达式是:{resourcePool

  • 如果你以前使用过官方的 vuejs-templates/webpack 样板,那么你应该对 static/ 目录很熟悉。这里面,你可以放置可供 main 和 renderer 进程使用的静态资源。在 Vue 应用程序中使用这些资源很简单,但是使用 fs 和其他需要完整路径的模块可能会有点棘手。 幸运的是,electron-vue 提供了一个 __static 变量,它可以在开发和产品阶段生成 st

  • 我知道,如果资源已实现自动关闭,您通过尝试传递的资源将自动关闭。到现在为止,一直都还不错。但是,当我有几个我想要自动关闭的资源时,我该怎么办呢。带插座的示例; 所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?

  • 我正在尝试为kubernetes吊舱中运行的服务分配CPU资源。服务大多是基于nodejs的RESTendpoint,带有一些DB操作。 在负载测试期间,尝试在100米和1000米之间对吊舱进行不同的组合。对于每秒的预期请求数,当值小于 我不知道应该根据什么来选择特定的CPU资源值。有人能在这方面帮助我吗?

  • 编辑: 澄清我的期望结果,因为我没有很好地沟通它: 能够使用和

  • 问题内容: 正如这个问题的标题所示,我想使用docker(docker.io)设置容器的最大磁盘/内存和cpu使用率。 有没有办法只使用docker来做到这一点? 问题答案: 内存/ CPU Docker现在支持更多资源分配选项: 通过-c标志分配CPU 内存限制,通过-m标志 特定的CPU内核,通过–cpuset标志 请查看更多详细信息。 如果使用lxc后端(),则可以指定更细粒度的资源分配方案