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
, 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).
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.
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
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.
Nesnenizin oluşturulmasını yasaklamak istiyorsanız, operator new
yerine özel kurucuyu yapın.
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.
C++ Standard'da böyle bir ifade bulamıyor. Hangi revizyonu kullanıyorsunuz? –
ISO/IEC 14882: 1998 (E) –
Kirill'in neden bulamadığını açıklayabilecek olan 24.4.1.1 değil, 20.4.1.1'dir. –