是否有使用operator new[]
作为分配器的STL实现?在我的编译器上,将Foo::operator new[]
设为私有并不能阻止我创建一个vector<Foo>
...这种行为是否被任何东西保证了呢?
是否有使用operator new[]
作为分配器的STL实现?在我的编译器上,将Foo::operator new[]
设为私有并不能阻止我创建一个vector<Foo>
...这种行为是否被任何东西保证了呢?
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).
标准库实现不会使用T::operator new[]来进行std::allocator。大多数情况下,它们在后台使用自己的内存池基础设施。
一般来说,如果你想停止动态分配Foo
对象,你需要将所有构造函数设置为私有,并提供一个创建Foo
对象的函数。当然,你也不能将它们创建为auto
变量。
std::vector使用作为模板参数传递的Allocator,默认为std::allocate。然而,分配器与new[]
不同--它只是分配原始内存,并且当您使用push_back()
或resize()
添加对象时,使用放置new
在该内存中实际创建对象。
您唯一可以在分配器中使用new[]
的方法就是有些滥用,使用诸如new char[size];
之类的东西来分配原始空间。尽管这种滥用相对无害,但它与您为该类重载的new[]
无关。
operator new
。Foo
创建STL容器,则只需将Foo
的复制构造函数设为私有(如果您正在使用C++11,则还要将移动构造函数设为私有)。所有STL容器对象必须具有有效的复制或移动构造函数,以便容器的分配器正确调用放置new
并在容器的分配内存块中构造对象的副本。
::operator new[]
来分配用于保存对象序列的内存块而不是单个对象,这样做是否更有意义? - Fred