2009-12-08 61 views
5

是否有使用operator new[]作为分配器的STL实现?在我的编译器上,使Foo::operator new[]私有并没有阻止我创建一个vector<Foo> ......这种行为是否由任何东西保证?STL分配器和运算符new []

回答

4

C++标准,部分20.4.1.1。默认分配器分配()函数使用的全局operator new:

pointer allocate(size_type n, allocator<void>::const_pointerhint=0); 

3 Notes: Uses ::operator new(size_t) (18.4.1). 
+0

在C++ Standard中找不到这样的语句。你使用哪个版本? – 2009-12-08 13:46:38

+0

ISO/IEC 14882:1998(E) – 2009-12-08 13:50:28

+1

这是20.4.1.1,并不24.4.1.1,这或许可以解释为什么基里尔没有找到它。 – 2009-12-08 14:08:11

2

STD库的实现将不会使用T ::运营商新的[]性病::分配器。他们大多数在幕后使用自己的内存池基础设施。

通常,如果要停止Foo对象被动态分配,则必须使所有构造函数都是私有的,并提供创建Foo对象的函数。当然,你将无法将它们创建为auto变量。

+2

向量基本上分配未初始化的内存,并在添加它们时将对象放入其中。保留内存不会创建实例。 – UncleBens 2009-12-08 14:00:33

2

的std ::向量使用该作为一个模板参数,为std ::分配缺省传递的分配器。分配器并不像new[]工作,虽然 - 它只是分配原始内存,并放置new用于实际创建在内存中的对象,当你告诉它添加的对象(例如,用push_back()resize())。

关于在分配器中使用new[]的唯一方法是,如果您滥用了一些东西,并使用诸如new char[size];之类的东西分配了原始空间。随着滥用行为的发生,这个人相当无害,但它仍然与您班级的new[]超负荷无关。

0

如果你想禁止你的对象的创建使私有构造函数,而不是operator new

0

除了这里其他的答案,如果你想防止有人为您创造Foo类型STL容器,然后简单地使拷贝构造函数Foo私人(也此举构造函数,如果你正在使用C++ 11)。所有STL容器对象都必须有一个有效的复制或移动构造函数才能正确调用放置new并在容器分配的内存块中构造对象的副本。