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.
- 1. Ayırıcılar
- 2. Python kodundaki basamaklı ayırıcılar
- 3. Yeni operatör nasıl çalışır?
- 4. ListView'da "Ayırıcılar"
- 5. Yeni operatör NULL döndürecek mi?
- 6. Neden STL haritaları için [] operatör const değil mi?
- 7. STL yığıtı ve priority_queue
- 8. STL
- 9. Küresel operatör olmadan çıplak metal yeni
- 10. C++ yükleme sırasında boyut bilgileri yeni operatör
- 11. Bin ayırıcılar ile Int64 formatı
- 12. hascode() ve == operatör sözleşmesi?
- 13. ObjectIdentifier() ve '===' Kullanıcısı Operatör
- 14. Operatör aşırı yüklenmesi [] ve =
- 15. CoffeeScript Varolan Operatör ve bu
- 16. Operatör '??' türü 'dizesi' ve 'System.DBNull'
- 17. Coalesce operatörü ve Koşullu operatör
- 18. C++: Veraset ve Operatör Yükleme
- 19. C++ STL koleksiyonları ve C# koleksiyonlarının karşılaştırması?
- 20. Babylon.js'de bir .obj ve .stl yükleyin
- 21. Aşırı yüklendiysem orijinal "yeni operatör" ü nasıl ararım?
- 22. C++ ile problem çözme STL
- 23. Bir STL vektörünün içindeki bir C++ STL vektörünü bulmak için
- 24. Tasarım mantığının arkasında STL
- 25. Üçlü Operatör Algoritması ile Ayrışan Üçlü Operatör
- 26. C++ Bir STL :: multimap
- 27. Neden C++ STL
- 28. STL takas dönüşü mü?
- 29. İkili Arama C++ STL
- 30. Vektör içinde STL
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. –