是否有使用operator new[]
作为分配器的STL实现?在我的编译器上,使Foo::operator new[]
私有并没有阻止我创建一个vector<Foo>
......这种行为是否由任何东西保证?STL分配器和运算符new []
回答
C++标准,部分20.4.1.1。默认分配器分配()函数使用的全局operator new:
pointer allocate(size_type n, allocator<void>::const_pointerhint=0);
3 Notes: Uses ::operator new(size_t) (18.4.1).
STD库的实现将不会使用T ::运营商新的[]性病::分配器。他们大多数在幕后使用自己的内存池基础设施。
通常,如果要停止Foo
对象被动态分配,则必须使所有构造函数都是私有的,并提供创建Foo
对象的函数。当然,你将无法将它们创建为auto
变量。
向量基本上分配未初始化的内存,并在添加它们时将对象放入其中。保留内存不会创建实例。 – UncleBens 2009-12-08 14:00:33
的std ::向量使用该作为一个模板参数,为std ::分配缺省传递的分配器。分配器并不像new[]
工作,虽然 - 它只是分配原始内存,并放置new
用于实际创建在内存中的对象,当你告诉它添加的对象(例如,用push_back()
或resize()
)。
关于在分配器中使用new[]
的唯一方法是,如果您滥用了一些东西,并使用诸如new char[size];
之类的东西分配了原始空间。随着滥用行为的发生,这个人相当无害,但它仍然与您班级的new[]
超负荷无关。
如果你想禁止你的对象的创建使私有构造函数,而不是operator new
。
除了这里其他的答案,如果你想防止有人为您创造Foo
类型STL容器,然后简单地使拷贝构造函数Foo
私人(也此举构造函数,如果你正在使用C++ 11)。所有STL容器对象都必须有一个有效的复制或移动构造函数才能正确调用放置new
并在容器分配的内存块中构造对象的副本。
- 1. 用'new []'运算符分配内存
- 2. 运算符new是否分配在THREAD堆上?
- 3. STL减少运算符和“无效运算符<”错误
- 4. C++:结构,运算符“new”和const
- 5. linux上运算符new和bad_alloc
- 6. C++ STL分配器VS运营商新
- 7. 使用new运算符,请
- 8. 绑定运算符new?
- 9. C++符合STL的分配器
- 10. 超载分配和加运算符
- 11. STL容器分配和const指针
- 12. STL的TCMalloc分配器
- 13. C++ STL问题:分配器
- 14. 什么分配器在STL
- 15. Flex(词法分析器){+}和{ - }运算符
- 16. 使用new()运算符分配内存时,mudflap会抛出核心转储
- 17. 划分和模运算符
- 18. STL向量运算符数据
- 19. STL集合= =运算符的问题
- 20. stl map插入运算符[]对区别
- 21. C++重载运算符new删除,
- 22. 重载new运算符与WDK
- 23. void *在malloc与运算符new
- 24. 快速new运算符的问题
- 25. 使用new运算符与变量
- 26. 为什么在C++ STL中分离算法,迭代器和容器STL
- 27. 定时运算符+,运算符,运算符*和运算符/
- 28. STL容器:构造函数的分配器参数和作用域分配器
- 29. 运算符new(n)与新的unsigned char [n]进行放置new
- 30. VBA“喜欢”运算符和通配符
在C++ Standard中找不到这样的语句。你使用哪个版本? – 2009-12-08 13:46:38
ISO/IEC 14882:1998(E) – 2009-12-08 13:50:28
这是20.4.1.1,并不24.4.1.1,这或许可以解释为什么基里尔没有找到它。 – 2009-12-08 14:08:11