5

是否有operator new[]用作分配器的 STL 实现?在我的编译器上,Foo::operator new[]私有化并没有阻止我创建一个vector<Foo>......这种行为有什么保证吗?

4

5 回答 5

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).
于 2009-12-08T13:40:38.707 回答
2

std::vector 使用作为模板参数传递的分配器,默认为 std::allocate。分配器并不像它那样工作new[]——它只是分配原始内存,当您告诉它添加对象时(例如,使用或) ,放置new用于在该内存中实际创建对象。push_back()resize()

您可以new[]在分配器中使用的唯一方法是,如果您稍微滥用了一些东西,并使用类似new char[size];. 随着滥用行为的发展,那是相当无害的,但它仍然与你的班级过载无关new[]

于 2009-12-08T14:48:28.450 回答
2

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

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

于 2009-12-08T13:40:39.303 回答
0

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

于 2009-12-08T15:04:28.107 回答
0

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

于 2011-09-21T04:03:04.590 回答