unique_ptr< shared_ptr<> weak_ptr<>;>... ne?
C olmayan ait bir nesne güvenle başvuru için 11, shared_ptr<>
bir nesne veya bir değişken ile mülkiyet bir ilişki kurmak için kullanabilirsiniz ve weak_ptr<>
.
Ayrıca unique_ptr<>
bir nesne veya değişken ile mülkiyet bir ilişki kurmak için kullanabilirsiniz. Ama eğer, sigara içilmez sahip diğer nesneler de başvurmak istiyorsanız bu nesne ne? weak_ptr<>
Bu durumda yararlı değildir. Ham işaretçiler yararlı, ama çeşitli olumsuzlukları ama bu std::*_ptr<>
türleri ile tutarlı olmayan yöntemleri ile yapılmaktadır automatically initialized to nullptr olabilir örneğin () getirin.
Olmayan sahibi eşyaları unique_ptr<>
) sahip olunan kaynaklar için weak_ptr<>
karşılığı nedir?
İşte üzerinde çalıştığım bir oyunda benzer bir şey açıklayan bir örnek.
class World
{
public:
Trebuchet* trebuchet() const { return m_trebuchet.get(); }
private:
std::unique_ptr< Trebuchet > m_trebuchet;
};
class Victim
{
public:
Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {}
~Victim()
{
delete m_trebuchet; // Duh. Oops. Dumb error. Nice if the compiler helped prevent this.
}
private:
Trebuchet* m_trebuchet; // Non-owning.
};
shared_ptr< Victim > createVictim( World& world )
{
return make_shared< Victim >( world.trebuchet() );
}
Burada bir nesne unique_ptr<>
üzerinden başka bir yere ait olmayan sahibi bir ilişkiyi korumak için ham bir işaretçi kullanın. Ama ham yapabileceğimiz en iyi şey mi?
CEVAP
"shared_ptr
başvuru başvuru sayısı denetim bloğu sayma gerektirir." davranış bildir shared_ptr
'In başvuru sayısı denetim bloğu(s) bunun için ayrı bir başvuru sayıları kullanın. weak_ptr
örnekleri bu blok için başvurular korumak ve weak_ptr
kendilerini delete
ed olmaktan başvuru sayısı denetim bloğu önlemek. Sivri bir nesne var onun yıkıcı çağrıldığında güçlü Kont gider sıfır (hangi olabilir veya olmayabilir sonucu delete
ıon bellek nerede o nesne oldu saklı) ve kontrol bloğu delete
ed yalnızca zayıf başvuru sayısı gider sıfır.
unique_ptr
'In tenet yükü üzerinden düz bir işaretçi sıfır olmasıdır. Ve başvuru sayısı denetim blokları (*19-ish*anlambilim destek için) tahsis yapma tenet keser. Eğer bu açıklama davranış gerekiyorsa, o zaman gerçekten, nesnenin diğer başvurular non-sahibi olsa bile paylaşılan semantiği istiyorum. Yine de bu durum ya da nesne yok edilmiş olsa da olmasa devletin bir paylaşım ... devam paylaşım var.
Genel nonowning referans ve bildirimi, unique_ptr
kalem için düz işaretçilerini veya düz başvuruları kullanın.
DÜZENLEME:
Örnek durumunda, Victim
Trebuchet*
yerine Trebuchet&
bir sormak gerekir gibi görünüyor. Daha sonra söz konusu nesnenin sahibi belli.
class World
{
public:
Trebuchet& trebuchet() const { return *m_trebuchet.get(); }
private:
std::unique_ptr< Trebuchet > m_trebuchet;
};
class Victim
{
public:
Victim( Trebuchet& theTrebuchet ) : m_trebuchet( theTrebuchet ) {}
~Victim()
{
delete m_trebuchet; // Compiler error. :)
}
private:
Trebuchet& m_trebuchet; // Non-owning.
};
shared_ptr< Victim > createVictim( World& world )
{
return make_shared< Victim >( world.trebuchet() );
}
Neden unique_ptr bir tür parametresi s...
Unique_ptr taşıdıktan sonra nullptr sa...
Nasıl bir kurucu veya bir işlev için u...
Std::unique_ptr<T> T tam tanımın...
Dizi ile unique_ptr için herhangi bir ...