当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《std::allocatorconstruct/destroy与placementnew/p->~T()》经验,为你挑选了1个好方法。

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

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

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

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

void construct(pointer p, const T& val)    { new(p) T(val); }
void destroy(pointer p)                    { p->~T(); }

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

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

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

谢谢.



1> jalf..:

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

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


是的,这是一个好点,它可以成为"后分配/预构建"日志记录或memleak跟踪的良好钩子.
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有