SORU
31 Mart 2009, Salı


Boost kullanırken olası tehlikeleri nelerdir::shared_ptr?

boost::shared_ptr kullanırken ayak kendinizi çekim yapabilirsiniz bazı yolları nelerdir? Diğer bir deyişle, tuzaklar Ben boost::shared_ptr kullandığımda önlemek için ne yapmalı?

CEVAP
31 Mart 2009, Salı


Döngüsel başvurular: özgün nesneye shared_ptr<> bir şey shared_ptr<>. weak_ptr<> Bu döngüyü kırmak için, elbette kullanabilirsiniz.


Yorumlar hakkında konuşuyorum ne bir örnek olarak aşağıdakileri ekliyorum.

class node : public enable_shared_from_this<node> {
public :
    void set_parent(shared_ptr<node> parent) { parent_ = parent; }
    void add_child(shared_ptr<node> child) {
        children_.push_back(child);
        child->set_parent(shared_from_this());
    }

    void frob() {
        do_frob();
        if (parent_) parent_->frob();
    }

private :
    void do_frob();
    shared_ptr<node> parent_;
    vector< shared_ptr<node> > children_;
};

Bu örnekte, her ebeveyn için bir işaretçi tutan düğümler, bir ağaç var. Frob() üye işlevi, ağacın içinden yukarı doğru olsun. (Bu tamamen tuhaf değildir; bazı GUI bu şekilde çalışır) çerçeveler.

Sorun, Eğer en üstteki düğüm için başvuru kaybedersen, en üstteki düğüm hala çocuk güçlü referansları tutar, ve çocuklar da ebeveynleri için güçlü bir referans tutun. Aslında bu kod, bu bellek sızıntısı ağacı ulaşmanın bir yolu olmasa da başvurular kendilerini temizlemeye gelen tüm örnekleri tutarak, dairesel, yok anlamına gelir.

class node : public enable_shared_from_this<node> {
public :
    void set_parent(shared_ptr<node> parent) { parent_ = parent; }
    void add_child(shared_ptr<node> child) {
        children_.push_back(child);
        child->set_parent(shared_from_this());
    }

    void frob() {
        do_frob();
        shared_ptr<node> parent = parent_.lock(); // Note: parent_.lock()
        if (parent) parent->frob();
    }

private :
    void do_frob();
    weak_ptr<node> parent_; // Note: now a weak_ptr<>
    vector< shared_ptr<node> > children_;
};

Burada, üst düğüm zayıf bir işaretçi tarafından değiştirilmiştir. Artık, başvurduğu düğüm ömür boyu söz vardır. Çocuklar için çok iyi referanslar tutan sırasında eğer en üstteki düğüm önceki örnekte olduğu gibi kapsam dışına çıkarsa böylece, o zaman, çocuklar, anne babalarının güçlü referansları tutma. Böylece nesne güçlü referansları vardır, ve kendini temizler. Buna karşılık, bu onları temizlemek için neden bu çocukların güçlü bir referans kaybetmenize neden olur, ve böyle devam eder. Kısacası, bu alışkanlık sızıntısı. Ve sadece stratejik shared_ptr<^ bir değiştirerek . weak_ptr<^ a ile . .

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Howcast

    Howcast

    4 EKİM 2007