Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有比编写包装器分配器更好的方法来存储对有状态分配器对象的引用?_C++_Memory Management_Lambda_Allocator_Std Function - Fatal编程技术网

C++ 有没有比编写包装器分配器更好的方法来存储对有状态分配器对象的引用?

C++ 有没有比编写包装器分配器更好的方法来存储对有状态分配器对象的引用?,c++,memory-management,lambda,allocator,std-function,C++,Memory Management,Lambda,Allocator,Std Function,例如: struct Foo { MyPoolAlloc<char> pool; std::vector<int , MyPoolAlloc<char>> vec_int; // The wrapper allocator would replace MyPoolAlloc<> here. std::vector<std::function<void()> , MyPoolAlloc<char>

例如:

struct Foo {
    MyPoolAlloc<char> pool;
    std::vector<int , MyPoolAlloc<char>> vec_int; // The wrapper allocator would replace MyPoolAlloc<> here.
    std::vector<std::function<void()> , MyPoolAlloc<char>> vec_funcs; // The wrapper allocator would replace MyPoolAlloc<> here.

    Foo() : vec_int(pool) , vec_funcs(pool) {}

    // I want to store lambdas with captured variables using the custom allocator as well:
    template<typename Func>
    void emplace_back(const Func& func) {
        vec_funcs.emplace_back(std::allocator_arg , pool , func);
    }
};
有没有比为MyPoolAlloc编写一个完整的额外包装类更干净的方法呢?

标准的“分配器”概念最好命名为“分配器引用”。每个对象要么引用一个全局实例(无状态),要么引用一个外部对象(有状态)

无论哪种方式,分配器感知容器中的分配器实例本身并不拥有内存池。这只是一个代理。请注意,分配器对象通常是在反弹和按值返回时复制的。您不希望
vector::get_allocator
复制整个内存池

所以,是的,你需要两门课

  • “包装器”、“代理”或“引用”,满足标准分配器要求,并为分配的类型获取模板参数

  • 与分配器接口无关但知道如何执行分配的内存池


  • 你是说只有一个游泳池吗?(那么它不是有状态的。)另外,如果您希望那些
    函数
    s尊重分配器,请查看我的库:。将其与
    std::scoped\u分配器\u适配器一起使用
    @potatosatter如果lambda捕获了
    std::string的副本
    ,它似乎不会将我的分配器用于字符串内容。作用域分配器是否修复了这一点,或者您的库是否修复了这一点?要将内容移动到新池中,目标对象需要一个“复制”构造函数,并将分配器作为第二个参数。兰博达斯不能这样做;您需要声明一个类。”这是一个例子,虽然它只是一个测试用例,而不是一个教程:(。还要注意,我只是做了一些修复,以便您可以下载头文件的新副本。
    : vec_int ((MyWrapperAlloc<char>(pool)));