Как изменить ресурс памяти карты - PullRequest
1 голос
/ 08 апреля 2020

У меня проблемы с изменением ресурса памяти карты в моем пользовательском контейнере. Кажется, я не могу ни изменить распределитель карты, ни создать новую карту с пользовательским ресурсом памяти.

#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

Как я могу сбросить контейнер во время выполнения, чтобы пользовательский ресурс памяти использовался для размещения элементов на карте?

1 Ответ

1 голос
/ 08 апреля 2020

Вы не можете изменить Распределитель контейнера после того, как он был построен. И даже ресурс памяти polymorphic_allocator не может быть изменен после его создания. Так что то, что вы хотите, на самом деле не выполнимо; ожидается, что вы будете знать, какой ресурс памяти будет использовать ваш контейнер во время его создания, и это ресурс allocator +, который он будет использовать до своего уничтожения.

Существуют обстоятельства, которые позволяют копировать / перемещать / Поменять новый распределитель в контейнер, но polymorphic_allocator запрещает их все.

...