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
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 . .
jshint "Olası sıkı ihlali.&`bağla...
Objective C Yöntemi Swizzling Tehlikel...
Boost kullanarak geçiş yapayım::shared...
Boost::shared_ptr bunu almak için...
boost ile static_cast::shared_ptr?...