SORU
8 Temmuz 2013, PAZARTESİ


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
8 Temmuz 2013, PAZARTESİ


"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_ptrkendilerini deleteed 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 deleteed 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() );
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • psidot

    psidot

    2 Kasım 2006