2008-09-22 22 views
11

İstisna güvenli bellek yönetimi almak için RAW işaretçilerinin bir çeşit akıllı işaretçi ile sarılması gerektiğini biliyoruz. Ancak, işaretçi kaplarına gelince, konu daha dikenli hale gelir.İşaretçiler ve kapsayıcılar

yine boost :: Shared_ptr vb

kullanabilirsiniz olsa konteynerler içerdiği nesne copyable olmakta ısrar std nedenle bu std :: auto_ptr kullanımını dışladı Ama açıkça tasarlanmış bazı boost kapları da vardır güvenle işaretçileri tutmak için: Ben smart_pointers bir kap üzerinde ptr_containers kullanmayı tercih gereken koşullar altında:
Pointer Container Library

sorudur görüyor musunuz?

boost::ptr_vector<X> 

or 

std::vector<boost::shared_ptr<X> > 

cevap

13

Boost işaretçi konteynerler tuttukları kaynaklar üzerinde sıkı sahipliğini olsa konteyner operasyonları darboğaz olduğundan emin olmak için profil gerektirir. Std :: vector < boost :: shared_ptr < X >>, sahipliğini paylaştı. Bunun neden gerekli olabileceğine dair sebepler var, ancak böyle değilse, varsayılan olarak :: ptr_vector < X> 'yi desteklemeyi tercih ederim. YMMV.

1

Eh, havai bir durumdur.

Paylaşılan işaretçilerden oluşan bir vektör, yeni bir akıllı işaretçi oluşturmayı, bir referansı artırma, referansı azaltma, yeniden boyutlandırma gibi bir çok yabancı kopyalama işlemi gerçekleştirir. Tüm bunlar bir işaretçi kabı ile önlenir.

:)

3

Akıllı işaretçiler, kaynak yönetimini ele almak için çok iyi bir yöntemdir, ancak sadece bir tanesi değildir. İyi yazılmış C++ kodunda çok az ham işaretçiyi göreceğinize katılıyorum, fakat deneyimlerimde o kadar çok akıllı işaretçiyi göremiyorsunuz. Ham işaretçilerden oluşan kaplar kullanılarak uygulanan mükemmel istisnai güvenli sınıflar vardır.

+0

Mümkün ve bazen en iyi seçenek olabilir, ancak bir sınıf istisna yaratan 2 veya daha fazla RAW işaretçisi içeriyorsa önemsiz değildir. Ama sorumu cevaplamadığın için seni işaretlemeliyim. –

İlgili konular