shared_ptr zincir/şube ikinci bir deleter ile

Bir share_ptr kullanıcısının ne zaman yapıldığını bilmem gereken bir durum var, yani kullanıcı nihayet tüm kopyalarını serbest bıraktığında. Normalde biri burada bir delici kullanır, ancak bu durumda küçük bir yakalama vardır. Temel nesne zaten bir shared_ptr!

Yani, sözde kodda:

shared_ptr a( new T );
.
.
.
shared_ptr b( a, bind( delete_func, id ) );

Orijinal shared_ptr'den yeni bir çeşit dal oluşturuyorum. Bu yeni shared_ptr b , normal bir paylaşımlı_ptr gibi kopyalanabilir ve kullanılabilir, ancak bu özel dal yapıldığında delete_func çağrılmalıdır. Şimdi, burada a.get() 'i kullanamıyorum, çünkü bu yeni shared_ptr temel nesneyi de korumalıdır (bunun için son shared_ptr olabilir).

Çerçeveyi büyük ölçüde değiştirmek zorunda kalmadan bunu yapmanın bir yolunu arıyorum. İyi bir çözüm gören var mı?

Akıllı işaretçiler ve ciltleme için destek kütüphanesi kullanıyorum.

1

2 cevap

Olası bir çözüm buldum.

Bunun gibi bir delici işlevi oluşturun:

void delete_func( int id, shared_ptr underlying );

Sonra shared_ptr'yi zincirlemek için şunu yapın:

shared_ptr b( a.get(), bind( &delete_func, id, a ) );

Bu, özel bir deletici (şubem) ile yeni bir eklenmemiş shared_ptr oluşturur. Parametrelerden biri orijinal shared_ptr'dir, dolayısıyla bu, alttaki shared_ptr nesnesini de korumalıdır. Şimdi bunu biraz test etmeliyim.

0
katma
@visitor, tam olarak istenen şey budur. Esasen b 'un kendi yaşam süresine sahip olması beklenir;
katma yazar edA-qa mort-ora-y, kaynak
b 'nin son kopyasının kapsam dışına çıkması durumunda bu, deliciyi çağırmazdı. a kopyaları o anda kapsamda olabilir. - Neden ilk olarak oluşturulduğunda a 'a özel bir deleter eklemiyorsunuz?
katma yazar visitor, kaynak

Neden shared_ptr 'in iki ayrı katmanına sahip olmak istediğinizi anlamıyorum, neden sadece size bildirecek uygun bir delici sağlamaz ve ardından işaretçiye checked_deleter ' i çağırın. ? Böylelikle tek bir deliciye ihtiyacınız vardır ve shared_ptr 'e bir deleter sağlama basit problemine geri döndünüz.

0
katma
a öğesinin bazı iç modüllerin parçası olduğunu düşünün. Bir işlev çağrılır ve a 'a da erişim gerektirir, ancak sistem bu harici arayanın onu kullanarak ne zaman yapıldığını bilmek zorundadır. Böylece, bir daha asla bilmeyeceği için a 'yı doğrudan geri dönemez, bu yüzden bir şekilde değişkenin bu yeni kopyasının ömrünün içine girmesi gerekir.
katma yazar edA-qa mort-ora-y, kaynak