对于我的一个项目,我正在从头开始编写一些 STL 容器(我有我的理由)。由于我如此密切地模仿 STL 的功能和接口,我正在尽我最大的努力遵守“如果它与标准构造具有相同名称,它将尽可能地符合标准”的策略。
所以,当然,我的容器将分配器作为模板参数,这非常好,因为它允许一些自定义分配方案。关于我的问题。
该std::allocator
接口将内存分配与对象构造分开。同样,它将释放与销毁分开。这是有道理的,因为从哪里获取内存与在 c++ 中正确构造对象或多或少无关。
因此,对于默认实现,有两个构造/释放函数看起来像这样(直接从书中提取):
void construct(pointer p, const T& val) { new(p) T(val); }
void destroy(pointer p) { p->~T(); }
如您所见,construct 只是调用placement new,而destroy 只是调用析构函数。
是否有任何理由使用这些而不是仅使用放置新和析构函数语法?“正确”的分配器可以以另一种方式实现这些吗?还是我保证所有符合标准的分配器实现都会以这种方式实现构造/销毁方法?
更重要的是,可以肯定地说我总是可以使用std::uninitialized_copy
andstd::uninitialized_fill
来构造容器的元素吗?
谢谢。