std::pmr::polymorphic_allocator 的模板参数有什么用?

问题描述 投票:0回答:1

我目前正在学习多态分配器,我看了一些视频并试图理解它。如果我有这个代码:

class MyClass {
public:
    MyClass(int val = 0) : m_val(val) {
        std::cout << "MyClass constructed with value: " << val << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destroyed with value: " << m_val << std::endl;
    }
private:
    int m_val;
};
int main() {
    char buffer[1024];
    std::size_t buffer_size = sizeof(buffer);
    // Use a monotonic buffer resource
    {
        std::pmr::monotonic_buffer_resource buffer_resource{buffer, buffer_size, std::pmr::null_memory_resource()};
        std::pmr::polymorphic_allocator<byte> allocator{ &buffer_resource };
        //std::pmr::polymorphic_allocator<MyClass> allocator{ &buffer_resource }; //still OK to use
        {
            std::pmr::vector<MyClass> vec(allocator);
            vec.reserve(256);
            for(int i = 0; i < 256; i++){
                vec.emplace_back(i);
            }
        }
    }
    return 0;
}

std::pmr::polymorphic_allocator<byte>
std::pmr::polymorphic_allocator<MyClass>
和有什么不一样?为什么两者都能正常工作?

c++ stl polymorphism allocator
1个回答
1
投票

来自

std::vector

Allocator - 用于获取/释放内存以及构造/销毁该内存中的元素的分配器。类型必须满足Allocator的要求。行为未定义 (C++20 前)/程序非良构 (C++20 起) 若

Allocator::value_type
T
不同。

所以,如果

Allocator::value_type
MyClass
不同:

  • 行为未定义(直到 C++20)
  • 程序格式错误 (C++20 起)

因此正确的使用方法是使用

std::pmr::polymorphic_allocator<MyClass>
.

为什么两者都能正常工作?

std::pmr::vector<MyClass>
构造函数 ...

constexpr explicit vector(
    const std::pmr::polymorphic_allocator<MyClass>& alloc) noexcept;

...将您提供的分配器转换为

std::pmr::polymorphic_allocator<MyClass>
,它使用与您的
allocator
相同的内存资源。

© www.soinside.com 2019 - 2024. All rights reserved.