Bir proje için bazı STL konteynırlarını sıfırdan yazıyorum (nedenlerim var). STL'nin işlevselliğini ve arayüzlerini bu kadar yakından taklit ettiğim için, politikaya uymak için elimden gelenin en iyisini yapıyorum "eğer standart bir yapıyla aynı isme sahipse, mümkün olduğunca standarda uyacaktır."std :: allocator yapı/yoklama vs. yerleştirme yeni/p-> ~ T()
Tabii ki, kaplarım, ayırıcıları bazı özel ayırma düzenlerine izin verdiği için çok güzel olan şablon parametresi olarak alır. Soruma göre.
std::allocator
arabirimi, bellek yapılandırmasını nesne yapısından ayırır. Aynı şekilde tahsisatı tahripten ayırır. Bu, mantıklı olduğunuz yerden C++ 'da bir nesneyi düzgün bir şekilde inşa etmek için az çok ilgisiz olduğu için mantıklıdır. sadece yeni yerleşim çağırır
void construct(pointer p, const T& val) { new(p) T(val); }
void destroy(pointer p) { p->~T(); }
sen inşa gördüğünüz gibi ve sadece yıkıcı çağırır yok:
Yani (bir kitap düz kaldırılmış) varsayılan uygulanması için şuna benzer iki yapı/deallocation fonksiyonları .
Yalnızca yeni ve yıkıcı sözdizimini kullanarak bunları kullanmak için herhangi bir neden var mı? Bir "doğru" ayırıcı, bunları başka bir şekilde uygulayabilir mi? Yoksa standarda uygun olan bütün ayırma uygulamalarının bu şekilde uygulanan yöntemleri imha edecek mi/yok edeceklerini garanti ediyorum mu?
Noktalarım, kaplarımın öğelerini oluşturmak için her zaman std::uninitialized_copy
ve std::uninitialized_fill
'u kullanabileceğimi söylemek güvenli midir?
Teşekkürler.
evet, bu iyi bir nokta, bu "tahsis sonrası/inşaat öncesi" kayıt veya memleak takibi için iyi bir kanca olabilir. –
Bu cevap doğru ama biraz yanıltıcı. Günlüğe kaydetme gibi yan etkiler, doğru istisna güvenliği ile yapmak için oldukça zordur. Daha sık özelleştirme, gömülü yeni ifadeye, ör. kurucu argümanları. Bkz. Https://groups.google.com/a/isocpp.org/d/topic/std-discussion/yZLnYy_y2z0/discussion – Potatoswatter