对于我的一个项目,我正在从头开始编写一些 STL 容器(我有我的理由)。由于我如此密切地模仿 STL 的功能和接口,因此我会尽最大努力遵守“如果它与标准结构同名,它将尽可能符合标准”的政策。
因此,当然我的容器将分配器作为模板参数,这非常好,因为它允许一些自定义分配方案。回答我的问题。
The std::allocator
接口将内存分配与对象构造分开。同样,它将释放与销毁分开。这是有道理的,因为从哪里获取内存或多或少与在 C++ 中正确构造对象无关。
因此,有两个构造/释放函数,其默认实现如下所示(直接从书中摘录):
void construct(pointer p, const T& val) { new(p) T(val); }
void destroy(pointer p) { p->~T(); }
正如您所看到的,构造只是调用新的放置,而销毁只是调用析构函数。
是否有任何理由使用这些而不是仅使用放置新和析构函数语法? “正确的”分配器可以以另一种方式实现这些吗?或者我是否保证所有符合标准的分配器实现都会有以这种方式实现的构造/销毁方法?
更重要的是,可以肯定地说我总是可以使用std::uninitialized_copy
and std::uninitialized_fill
用于构建我的容器的元素?
Thanks.
分配器可以在构造/销毁之前和之后添加日志记录语句,或者它关心的任何其他副作用。
当然,实际的构造必须通过调用placement new和析构函数来进行,但规则手册中并没有说没有其他的必须发生在构造/销毁函数中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)