2009-12-08 22 views
5

operator new[]'yi bir ayırıcı olarak kullanan STL uygulamaları var mı? Derleyicimde Foo::operator new[] özel yapmam, vector<Foo> yaratmamı engellemedi ... bu davranış bir şey tarafından garanti ediliyor mu?STL ayırıcılar ve yeni operatör []

cevap

4

, C++ standart bölüm 20.4.1.1. Varsayılan ayırıcısı tahsis() fonksiyonu yeni küresel operatörünü kullanır:

pointer allocate(size_type n, allocator<void>::const_pointerhint=0); 

3 Notes: Uses ::operator new(size_t) (18.4.1). 
+0

C++ Standard'da böyle bir ifade bulamıyor. Hangi revizyonu kullanıyorsunuz? –

+0

ISO/IEC 14882: 1998 (E) –

+1

Kirill'in neden bulamadığını açıklayabilecek olan 24.4.1.1 değil, 20.4.1.1'dir. –

2

std kütüphane uygulamaları T kullanmaz :: operatör yeni [] std :: ayırıcısı için. Çoğu, sahnelerin ardında kendi bellek havuzu altyapısını kullanıyor. Genel olarak, dinamik olarak ayrılan Foo nesnelerini durdurmak istiyorsanız, tüm kurucular için özel ve Foo nesneleri oluşturan bir işlev sağlamanız gerekir. Tabii ki, onları olsa bile auto değişkenleri oluşturamazsınız.

+2

Bir vektör temel olarak başlatılmamış belleği ayırır ve daha sonra eklendiklerinde nesneleri buraya yerleştirir. Rezervasyon hafızası örnekler oluşturmaz. – UncleBens

2

std :: vektör, std :: allocate değerine varsayılan bir şablon bağımsız değişkeni olarak geçirilen bir Allocator kullanır. Allocator, new[] gibi çalışmaz, ancak sadece ham belleği ayırır ve new yerleşimi, nesneleri eklemeyi düşündüğünüzde (ör. push_back() veya resize() ile) bu bellekteki nesneleri oluşturmak için kullanılır.

new char[size]; gibi bir şeye göre boş alan ayırıp, bir ayırıcıda new[] kullanabilmenizin tek yolu, bir ayırıcıda olurdu. Suistimaller gittikçe, bu oldukça zararsızdır, ancak sınıf için new[] aşırı yükünüzle ilişkisizdir.

0

Nesnenizin oluşturulmasını yasaklamak istiyorsanız, operator new yerine özel kurucuyu yapın.

0

Diğer yanıtlara ek olarak, herhangi birinin Foo türünüz için bir STL kapsayıcısı oluşturmasını engellemek istiyorsanız, o zaman sadece kopya yapıcıyı Foo özel yapın (ayrıca, eğer varsa C++ 11). Tüm STL kapsayıcı nesneler, kapsayıcının new numaralı yerleşimini doğru olarak çağırmak için kapsayıcı ayırıcısı için geçerli bir kopyasına veya taşıyıcısına sahip olmalı ve nesnenin bir kopyasını, kapsayıcı için ayrılmış bellek bloğunun bir kopyasını oluşturmalıdır.