是否有operator new[]
用作分配器的 STL 实现?在我的编译器上,Foo::operator new[]
私有化并没有阻止我创建一个vector<Foo>
......这种行为有什么保证吗?
5 回答
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).
std::vector 使用作为模板参数传递的分配器,默认为 std::allocate。分配器并不像它那样工作new[]
——它只是分配原始内存,当您告诉它添加对象时(例如,使用或) ,放置new
用于在该内存中实际创建对象。push_back()
resize()
您可以new[]
在分配器中使用的唯一方法是,如果您稍微滥用了一些东西,并使用类似new char[size];
. 随着滥用行为的发展,那是相当无害的,但它仍然与你的班级过载无关new[]
。
std 库实现不会将 T::operator new[] 用于 std::allocator。他们中的大多数在幕后使用自己的内存池基础设施。
通常,如果您想停止Foo
动态分配对象,您必须将所有构造函数设为私有并提供一个创建Foo
对象的函数。当然,您也不能将它们创建为auto
变量。
如果您想禁止创建您的对象,请使用私有构造函数而不是operator new
.
除了此处的其他答案之外,如果您想阻止任何人为您的 type 创建 STL 容器Foo
,那么只需将复制构造函数设为Foo
私有(如果您使用 C++11,也可以使用移动构造函数)。所有 STL 容器对象都必须具有有效的复制或移动构造函数,以便容器的分配器正确调用放置new
并在为容器分配的内存块中构造对象的副本。