C ++ tamamen bellek sahipliğiyle ilgilidir - diğer bir deyişle sahiplik semantiği .
Bu belleği serbest bırakmak, dinamik olarak ayrılmış bellek yığınının sahibinin sorumluluğundadır. Yani soru gerçekten hafızanın sahibi oluyor.
C ++ 'da sahiplik, ham işaretçi türüyle belgelenir, bu nedenle iyi bir (IMO) C ++ programında ham işaretçilerin dolaştığını görmek çok nadirdir ( nadirdir , hiçbir zaman değil ) (ham işaretçilerin çıkarılmış sahipliği olmadığı için hafızanın kime ait olduğunu söylemeyin ve bu nedenle belgeleri dikkatlice okumadan sahiplikten kimin sorumlu olduğunu söyleyemezsiniz).
Tersine, her ham işaretçinin kendi akıllı işaretçi sarmalayıcısında depolandığı bir sınıfta depolanan ham işaretçilerin görülmesi nadirdir. ( Not: Bir nesneye sahip değilseniz, onu depolamamalısınız çünkü ne zaman kapsam dışına çıkıp yok olacağını bilemezsiniz.)
O halde soru:
- İnsanlar ne tür bir sahiplik anlamıyla karşılaşır?
- Bu semantiği uygulamak için hangi standart sınıflar kullanılır?
- Hangi durumlarda onları yararlı buluyorsunuz?
Cevap başına 1 tür anlamsal sahiplik bırakalım, böylece tek tek yukarı ve aşağı oylanabilirler.
Özet:
Kavramsal olarak, akıllı işaretçiler basittir ve saf bir uygulama kolaydır. Denenen pek çok uygulama gördüm, ancak her zaman bir şekilde, sıradan kullanım ve örnekler için açık olmayan bir şekilde kırıldılar. Bu nedenle, kendi kitaplığınızı döndürmek yerine her zaman bir kitaplıktaki iyi test edilmiş akıllı işaretçileri kullanmanızı öneririm. std::auto_ptr
veya Boost akıllı işaretçilerinden biri tüm ihtiyaçlarımı karşılıyor gibi görünüyor.
std::auto_ptr<T>
:
Tek kişi nesnenin sahibidir. Mülkiyet devrine izin verilir.
Kullanım: Bu, açıkça sahiplik aktarımını gösteren arayüzler tanımlamanıza olanak tanır.
boost::scoped_ptr<T>
Tek kişi nesnenin sahibidir. Mülkiyet devrine izin VERİLMEZ.
Kullanım: Açıkça sahiplik göstermek için kullanılır. Nesne, yıkıcı tarafından veya açıkça sıfırlandığında imha edilecektir.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Çoklu sahiplik. Bu basit bir referans sayılan göstericidir. Referans sayısı sıfıra ulaştığında nesne yok edilir.
Kullanım: Bir nesnenin, derleme zamanında belirlenemeyen bir ömre sahip birden fazla owers'ı olabileceği zaman.
boost::weak_ptr<T>
:
shared_ptr<T>
Bir işaretçiler döngüsünün meydana gelebileceği durumlarda kullanılır .
Kullanım: Yalnızca döngü paylaşılan bir yeniden sayımı sürdürürken, döngüleri nesneleri tutmadan durdurmak için kullanılır.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Bu yeniden ifade edilebilir mi? Ben hiç anlamıyorum.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. RAW işaretçilerinin sahiplik semantiği yoktur. Sahibini bilmiyorsanız, nesneyi silmekten kimin sorumlu olduğunu bilmiyorsunuz. Sahipliği tanımlayan işaretçileri sarmak için kullanılan birkaç standart sınıf vardır (std :: shared_ptr, std :: unique_ptr vb.) İşaretçinin silinmesinden kimin sorumlu olduğunu tanımlayın.