我正在尝试实现一个可以与
std::vector
一起使用的堆栈分配器。有很多已经存在的实现,例如 this 或 this。然而,它们都假设缓冲区不是成员,而是由用户提供给分配器的。 chromium 实现中的一条评论甚至说:
STL喜欢复制分配器,因此分配器本身无法保存数据。
我自己尝试了一下,
vector
在它的析构函数中崩溃了。看起来它为容器代理创建了我的分配器的临时版本,通过它分配内存,然后立即销毁它,使指向分配数据的指针成为悬空指针。
实际上可能有一个分配器将静态缓冲区存储为成员吗?
实际上可能有一个分配器将静态缓冲区存储为成员吗?
如果分配器应该满足标准库中分配器感知容器(和其他实用程序)所需的Allocator标准库概念,那么不行,内存资源本身不能嵌入到分配器对象中。
其中一个要求是分配器对象可以自由复制构造,并且复制的分配器对象必须能够释放原始分配器对象分配的内存。只要副本仍然存在,销毁分配器对象本身也不会导致内存资源消失。
所以需要有一个间接的。用户自己管理内存资源的生命周期,并且分配器对象仅保存指向它的非拥有指针,或者您可以对分配器对象中的资源使用
shared_ptr
来让分配器对象复制共同拥有内存资源。但是,这当然不允许堆栈所有权。