STL分配器和operator new[]

5

是否有使用operator new[]作为分配器的STL实现?在我的编译器上,将Foo::operator new[]设为私有并不能阻止我创建一个vector<Foo>...这种行为是否被任何东西保证了呢?

5个回答

4

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

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

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

在 C++ 标准中找不到这样的语句。您使用的是哪个版本? - Kirill V. Lyadvinsky
1
这是20.4.1.1,而不是24.4.1.1,这可能解释了为什么Kirill没有找到它。 - Steve Jessop
使用::operator new[]来分配用于保存对象序列的内存块而不是单个对象,这样做是否更有意义? - Fred
我只是引用标准。关于标准为什么这样做的讨论,建议在usenet组comp.std.c++中提问。 - anon

2

标准库实现不会使用T::operator new[]来进行std::allocator。大多数情况下,它们在后台使用自己的内存池基础设施。

一般来说,如果你想停止动态分配Foo对象,你需要将所有构造函数设置为私有,并提供一个创建Foo对象的函数。当然,你也不能将它们创建为auto变量。


2
向量基本上分配未初始化的内存,并在稍后添加对象时将其放置在其中。保留内存不会创建实例。 - UncleBens

2

std::vector使用作为模板参数传递的Allocator,默认为std::allocate。然而,分配器与new[]不同--它只是分配原始内存,并且当您使用push_back()resize()添加对象时,使用放置new在该内存中实际创建对象。

您唯一可以在分配器中使用new[]的方法就是有些滥用,使用诸如new char[size];之类的东西来分配原始空间。尽管这种滥用相对无害,但它与您为该类重载的new[]无关。


0
如果您想禁止创建对象,可以使用私有构造函数而不是operator new

0
除了其他答案之外,如果您想防止任何人为您的类型Foo创建STL容器,则只需将Foo的复制构造函数设为私有(如果您正在使用C++11,则还要将移动构造函数设为私有)。所有STL容器对象必须具有有效的复制或移动构造函数,以便容器的分配器正确调用放置new并在容器的分配内存块中构造对象的副本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接