2009-12-08 66 views
5

是否有使用operator new[]作爲分配器的STL實現?在我的編譯器上,使Foo::operator new[]私有並沒有阻止我創建一個vector<Foo> ......這種行爲是否由任何東西保證?STL分配器和運算符new []

回答

4

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). 
+0

在C++ Standard中找不到這樣的語句。你使用哪個版本? – 2009-12-08 13:46:38

+0

ISO/IEC 14882:1998(E) – 2009-12-08 13:50:28

+1

這是20.4.1.1,並不24.4.1.1,這或許可以解釋爲什麼基里爾沒有找到它。 – 2009-12-08 14:08:11

2

STD庫的實現將不會使用T ::運營商新的[]性病::分配器。他們大多數在幕後使用自己的內存池基礎設施。

通常,如果要停止Foo對象被動態分配,則必須使所有構造函數都是私有的,並提供創建Foo對象的函數。當然,你將無法將它們創建爲auto變量。

+2

向量基本上分配未初始化的內存,並在添加它們時將對象放入其中。保留內存不會創建實例。 – UncleBens 2009-12-08 14:00:33

2

的std ::向量使用該作爲一個模板參數,爲std ::分配缺省傳遞的分配器。分配器並不像new[]工作,雖然 - 它只是分配原始內存,並放置new用於實際創建在內存中的對象,當你告訴它添加的對象(例如,用push_back()resize())。

關於在分配器中使用new[]的唯一方法是,如果您濫用了一些東西,並使用諸如new char[size];之類的東西分配了原始空間。隨着濫用行爲的發生,這個人相當無害,但它仍然與您班級的new[]超負荷無關。

0

如果你想禁止你的對象的創建使私有構造函數,而不是operator new

0

除了這裏其他的答案,如果你想防止有人爲您創造Foo類型STL容器,然後簡單地使拷貝構造函數Foo私人(也此舉構造函數,如果你正在使用C++ 11)。所有STL容器對象都必須有一個有效的複製或移動構造函數才能正確調用放置new並在容器分配的內存塊中構造對象的副本。