是否有使用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. 綁定運算符new?
- 6. 使用new運算符,請
- 7. C++ STL分配器VS運營商新
- 8. 超載分配和加運算符
- 9. C++符合STL的分配器
- 10. STL容器分配和const指針
- 11. 什麼分配器在STL
- 12. STL的TCMalloc分配器
- 13. C++ STL問題:分配器
- 14. 使用new()運算符分配內存時,mudflap會拋出核心轉儲
- 15. void *在malloc與運算符new
- 16. 快速new運算符的問題
- 17. STL向量運算符數據
- 18. STL集合= =運算符的問題
- 19. 運算符new(n)與新的unsigned char [n]進行放置new
- 20. 爲什麼在C++ STL中分離算法,迭代器和容器STL
- 21. SQL LIKE運算符和通配符
- 22. VBA「喜歡」運算符和通配符
- 23. 使用邏輯運算符分配值
- 24. SyntaxError:無法分配給運算符
- 25. 匹配運算符
- 26. 如何爲動態分配的stl容器設置分配器?
- 27. 運算符在使用STL列表容器時過載?
- 28. STL向量分配
- 29. 運算符new/delete和類層次結構
- 30. 我可以使用全局運算符new作爲運算符new重載的類嗎?
在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