STL分配器和运算符new []

时间:2009-12-08 13:30:38

标签: c++ stl allocator new-operator

是否存在使用operator new[]作为分配器的STL实现?在我的编译器上,将Foo::operator new[]设为私有并不妨碍我创建vector<Foo> ...这种行为是否由任何东西保证?

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

std库实现不会对std :: allocator使用T :: operator new []。他们中的大多数人在幕后使用自己的内存池基础设施。

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

答案 2 :(得分:2)

std :: vector使用一个作为模板参数传递的Allocator,默认为std :: allocate。虽然分配器不像new[]那样工作 - 它只是分配原始内存,而当你告诉它添加对象时,使用placement new来实际创建该内存中的对象(例如{ {1}}或push_back())。

关于在分配器中使用resize()的唯一方法是,如果您滥用了一些东西,并使用new[]之类的东西分配原始空间。随着滥用行为的发生,这个行为是相当无害的,但它仍然与您对该类new char[size];的重载无关。

答案 3 :(得分:0)

如果你想禁止创建你的对象make private constructor而不是operator new

答案 4 :(得分:0)

除了此处的其他答案之外,如果您想阻止任何人为您的类型Foo创建STL容器,那么只需将Foo的复制构造函数设为私有(也是移动 - 构造函数,如果你正在使用C ++ 11)。所有STL容器对象必须具有容器的分配器的有效副本或移动构造函数才能正确调用placement new并在容器的已分配内存块中构造对象的副本。