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)));