9

对于我的一个项目,我正在从头开始编写一些 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_copyandstd::uninitialized_fill来构造容器的元素吗?

谢谢。

4

2 回答 2

11

分配器可以在构造/销毁之前和之后添加日志语句,或者它想要做的任何其他副作用。

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

于 2009-03-17T01:28:18.713 回答
3

这只是为了隐藏方法中的分配细节。即,我们正在提供用于构造和销毁的 API,将来我们可以更改实现。现在我们使用placement new来分配内存,将来如果我们想改变分配,我们只需要改变这两个方法。

于 2009-03-17T01:20:02.743 回答