std :: allocator construct/destroy与placement new/p-> ~T()

Eva*_*ran 8 c++ standards allocation

对于我的一个项目,我正在从头开始编写一些STL容器(我有我的理由).由于我如此密切地模仿STL的功能和接口,我正在尽力遵守策略"如果它与标准构造具有相同的名称,它将尽可能符合标准."

所以,当然我的容器将allocator作为模板参数,这非常好,因为它允许一些自定义分配方案.关于我的问题.

所述std::allocator接口从对象分离结构的存储器分配.同样,它将解除分配与破坏分开.这是有道理的,因为从中获取内存与在c ++中正确构造对象或多或少无关.

因此,有两个构造/释放函数对于默认实现看起来像这样(直接从书中解除):

void construct(pointer p, const T& val)    { new(p) T(val); }
void destroy(pointer p)                    { p->~T(); }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,构造只是调用placement new和destroy只是调用析构函数.

是否有任何理由使用这些而不仅仅使用placement new和析构函数语法?一个"正确的"分配器可以用另一种方式实现这些吗?或者我保证符合标准的所有分配器实现都会以这种方式实现构造/销毁方法吗?

更重要的是,可以说我可以随时使用std::uninitialized_copystd::uninitialized_fill构建容器的元素吗?

谢谢.

jal*_*alf 11

分配器可以在构造/销毁之前和之后添加日志记录语句,或者它所关心的任何其他副作用.

当然,实际的构造必须通过调用placement new和析构函数来实现,但是在规则手册中并没有说构造/销毁函数中不会发生任何其他事情.

  • 是的,这是一个好点,它可以成为"后分配/预构建"日志记录或memleak跟踪的良好钩子. (2认同)