C ++ 11'de util.smartptr.shared.const / 9:
Efektler: p nesnesine ve d sileceğine sahip olan bir paylaşılan_ptr nesnesi oluşturur. İkinci ve dördüncü kurucular dahili kullanım için bellek ayırmak üzere a'nın bir kopyasını kullanacaktır.
İkinci ve dördüncü kurucular şu prototiplere sahiptir:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
Son taslakta, util.smartptr.shared.const / 10 bizim amacımızla eşdeğerdir:
Efektler: p nesnesine ve d sileceğine sahip olan bir paylaşılan_ptr nesnesi oluşturur. T bir dizi türü olmadığında, birinci ve ikinci kurucular p ile paylaşılan_from_bu işlevini etkinleştirir. İkinci ve dördüncü kurucular dahili kullanım için bellek ayırmak üzere a'nın bir kopyasını kullanacaktır. Bir istisna atılırsa, d (p) çağrılır.
Dolayısıyla, tahsis edilen belleğe tahsis edilmesi gerekiyorsa, ayırıcı kullanılır. Mevcut standarda ve ilgili hata raporlarına dayanarak, tahsis zorunlu değildir ancak komite tarafından üstlenilir.
Arayüz rağmen shared_ptr
orada hiç bir kontrol bloğu ve hepsi bir uygulama verir shared_ptr
ve weak_ptr
bağlantılı bir listeye konur, uygulamada böyle bir uygulama yoktur. Ayrıca, ifadeler, örneğin use_count
bunun paylaşıldığı varsayılarak değiştirilmiştir .
Silinmenin yalnızca yapılandırılabilir hareket etmesi gerekir. Böylece, içinde birkaç kopya olması mümkün değildir shared_ptr
.
Silmeyi özel olarak tasarlanmış bir yere koyan shared_ptr
ve özel shared_ptr
silindiğinde hareket ettiren bir uygulama düşünülebilir . Uygulama uygun görünse de, özellikle kullanım sayısı için bir kontrol bloğuna ihtiyaç duyulabileceği için gariptir (belki de kullanım sayısıyla aynı şeyi yapmak garip olabilir).
Bulduğum ilgili DR'ler: 545 , 575 , 2434 (bu, tüm uygulamaların bir kontrol bloğu kullandığını kabul eder ve çoklu iş parçacığı kısıtlamalarının biraz zorunlu kıldığını ima eder), 2802 (bu, silmenin yalnızca yapılandırılabilir hareket etmesini gerektirir ve böylece uygulamayı silme işlemi birkaç shared_ptr
's arasında kopyalanır ).