C++ 如何更改地图';内存资源
在自定义容器中更改地图的内存资源时遇到问题。 似乎我既不能更改映射的分配器,也不能使用自定义内存资源创建新映射C++ 如何更改地图';内存资源,c++,memory-management,c++17,dynamic-memory-allocation,C++,Memory Management,C++17,Dynamic Memory Allocation,在自定义容器中更改地图的内存资源时遇到问题。 似乎我既不能更改映射的分配器,也不能使用自定义内存资源创建新映射 #include <iostream> #include <memory_resource> #include <map> using Map = std::pmr::map<const std::string, int>; class custom_resource : public std::pmr::memory_resour
#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;
}
#包括
#包括
#包括
使用Map=std::pmr::Map;
类自定义资源:公共std::pmr::内存资源{
公众:
void*do_分配(std::size_t字节,std::size_t对齐)覆盖{
std::cout构建容器后,您无法更改容器的分配器。即使是多态分配器
的内存资源也无法在构建容器后更改。因此,您想要的并不是真正可行的;您需要知道容器在构建时将使用什么内存资源,也就是说在销毁之前将使用的分配器+资源
在某些情况下,您可以将新的分配器复制/移动/交换到容器中,但polymorphic_allocator
不允许所有这些分配器。谢谢,我接受在构造后无法更改它。但我甚至无法获得使用新资源构造的新分配器。我猜是因为=Map{&resource}
调用赋值副本构造函数或类似的东西?如果我将映射更改为一个唯一的\u ptr
,那么我会让它工作。