【问题标题】:How to change a map's memory resource如何更改地图的内存资源
【发布时间】:2020-07-20 19:23:30
【问题描述】:

我无法更改自定义容器中地图的内存资源。 看来我既不能更改地图的分配器,也不能使用自定义内存资源创建新地图。

#include <iostream>
#include <memory_resource>
#include <map>


using Map = std::pmr::map<const std::string, int>;

class custom_resource : public std::pmr::memory_resource {

    public:

    void* do_allocate(std::size_t bytes, std::size_t alignment) override {
        std::cout << "Using custom resource" << std::endl;
        return std::pmr::get_default_resource()->allocate(bytes, alignment);
    }

    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {
    }

    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override {
        return false;    
    }
};

struct MyContainer {

  void Reset(std::pmr::memory_resource &resource)
  {
      map_ = Map{&resource};
  }

  void AddItem(std::string k) {
      map_[k] = 1;
  }

    std::pmr::memory_resource* default_resource = std::pmr::get_default_resource();
    // custom_resource custom{}; // uncomment this and next line to see it work
    // Map map_{&custom};
    Map map_{default_resource};
};


int main() {

    MyContainer container{};
    container.AddItem("a"); // no output expected

    custom_resource custom{};
    container.Reset(custom);

    container.AddItem("b"); // output expected

    return 0;
}

https://godbolt.org/z/aVMuw6

如何在运行时重置容器,以便使用自定义内存资源分配地图中的项目?

【问题讨论】:

    标签: c++ memory-management c++17 dynamic-memory-allocation


    【解决方案1】:

    容器的分配器在构建后不能更改。甚至polymorphic_allocator的内存资源在构造完成后也无法更改。所以你想要的并不是真正可行的;您应该知道容器在构建时将使用什么内存资源,即在销毁之前它将使用的分配器+资源。

    在某些情况下,您可以将新分配器复制/移动/交换到容器中,但 polymorphic_allocator 不允许所有这些。

    【讨论】:

    • 谢谢,我接受施工后无法更改。但我什至无法用新资源建造一个新的。我猜是因为= Map{&amp;resource} 调用了赋值复制构造函数或类似的东西?如果我将地图更改为unique_ptr,那么我可以让它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多