2016-08-11 16 views
14

std::unique_ptr ve başka bir ham işaretçim var. İşlenmemiş işaretçinin, herhangi bir sahiplik olmadan unique_ptr içeriğine işaret etmesini istiyorum. Sadece-okunur ilişkisi:std :: unique_ptr içeriğine işaret etme

auto bar=std::make_unique<foo>(); 
auto ptr=bar.get();// This may point to another value later 

Bu kötü mü? Alternatif var mı?

Not: gerçek örnek daha karmaşıktır. Aynı sınıfta değiller.

+2

Bu bar.get(); '? –

+0

@ πάνταῥεῖ evet özür dilerim –

+3

Bunun ideal olduğunu söyleyebilirim. Ancak farklı anlamlara sahip bir 'std :: zayıf_ptr' olduğu için muhtemelen farklı bir isim seçerdim. – Galik

cevap

25

, o zaman bu mükemmel para cezası ve muhtemelen sahipsiz işaretçiler geçmek için gereken herhangi bir durum için ideal.

Bu iki koşul garanti edilemiyorsa, muhtemelen std::shared_ptr ve std::weak_ptr kullanıyor olmalısınız.

+7

Ve muhtemelen 'shared_ptr' kullanmıyor olmanız gerekir, çünkü" bekleyin, kaynak sorunlarımı shared_ptr ile çözebilirim "ifadesinin% 99'u kötü bir fikirdir. – Yakk

+5

@Yakk En iyi ihtimalle, bu hiperbolik ve en kötüsü naif olarak adlandırıyorum. En iyi, en idiomatik çözümün std :: shared_ptr 'kullanımını çağırdığı C++ topraklarında birçok sorunla karşılaştım. İlk etapta işaretçilere olan güvenin, tasarım karmaşıklığının bir sebebini (veya semptomunu) temsil etme eğiliminde olduğunu, ancak zamanın% 99'unda kötü olsaydı, Java'nın (paylaşılan olarak "shared_ptr" gibi nesneleri kullandığını) size vereceğim tüm işaretçiler için) bir dil olarak kullanılamaz ve durumun böyle olmadığını biliyoruz. – Xirema

+5

Gerçekten biliyor muyuz? Ama cidden, Java, rc işaretçilerden farklı bir canavar olan tam gc işaretçileri kullanır. RC işaretçilerinin bir tür gerçek gc işaretçisi olarak düşünülmesi, bir bileşenin tasarımında temel bir hatanın işareti olup, bu tür hatalar% 99'dur. Paylaşılan işaretçilerin haklı olduğu durumları buldum (yalnızca bir kaynağın gerçek * paylaşımlı sahipliği * olduğunda, sadece "burada işaretçi sorunlarının nasıl görüneceğini düşünmek istemiyorum"), ancak nadiren genel bir gözlemlenen yaşam boyu sorunu olabilir. sadece sisteme paylaşılan ve zayıf işaretçiler kürekle çözülebilir. – Yakk

26

Hayır, kötü değil ve standart kütüphane proposed std::observer_ptr birleştirir kadar olmayan bir sahibi gözlemci ifade etmenin deyimsel yolu bu. Eğerbar 'ın ömrü hiçbir programcı/üstlenmeden şimdiye herhangi bir noktada delete ptr; yazacak o)ptr ömrünü aşan VE B olacaktır) o A garanti ederseniz

+3

Ve bundan sonra, bunu temsil etmenin deyimsel yolu olacaktır. Core C++ yönergeleri 'observer_ptr' kullanmıyor; Bütün çıplak T * 'lerin mülkiyeti temsil etmediğini söylerler. –

+5

@NicolBolas Std :: experimental :: observer_ptr '' std :: observer_ptr' olduktan sonra hala söyleyecekler mi sorusu. Kılavuzun mülkiyetsiz olarak "T * oku" durumuna dönüştüğünü, ancak sahip olmadığımı "std :: observer_ptr " olarak yazdığını hayal edebiliyorum. " – Angew

+2

"* Std :: experimental :: observer_ptr = 'std :: observer_ptr' olduktan sonra hala bunu söyleyip söylemeyecekleri sorusu. *" Ve bunun gerçekten gerçekleşip gerçekleşmeyeceği sorusu; TS'nin önerilmekte ve çekirdek standart olarak benimsenmesi arasındaki değişim. Ayrıca, bu, ümitsiz işaretçiler için çıplak işaretçiler kullanan mevcut C++ kodunun * milyarlarca satırını sihirli bir şekilde dönüştürmeyecektir. –

İlgili konular