2009-12-01 18 views
19

Aşağıdaki kodu dikkate alın.Paylaşılan_ptr ile bellek sızıntısı nasıl önlenir?

using boost::shared_ptr; 
struct B; 
struct A{ 
    ~A() { std::cout << "~A" << std::endl; } 
    shared_ptr<B> b;  
}; 
struct B { 
    ~B() { std::cout << "~B" << std::endl; } 
    shared_ptr<A> a; 
}; 

int main() { 
    shared_ptr<A> a (new A); 
    shared_ptr<B> b (new B); 
    a->b = b; 
    b->a = a; 

    return 0; 
} 

hiçbir çıkışyoktur. Hayır desctructor denir. Bellek sızıntısı. Her zaman akıllı göstericinin bellek sızıntılarından kaçınmasına yardımcı olduğuna inanıyorum.

Sınıflarda çapraz referanslara ihtiyacım varsa ne yapmalıyım?

cevap

47

Bu gibi döngüsel referanslarınız varsa, bir nesnenin shared_ptr değil weak_ptr tutması gerekir. the shared_ptr introduction kaynaktan

: uygulama referans sayma kullanan

için, shared_ptr örnekleri döngüleri ıslah olmaz. Örneğin, eğer main(), A 'ın kullanımı sayımı orijinal shared_ptr 2. İmha olacaktır shared_ptr doğrudan veya dolaylı olarak A bir shared_ptr geri tutan A, bir 1 bir kullanım sayısına Kullanım weak_ptr için birlikte sarkan A bırakacaktır tutan "kırılma döngüleri."

Bağlantı için teşekkürler, Glen.

+6

@Alexey, girişte bu sorunun açık bir şekilde uyarıldığı dokümanlar için bir bağlantı. http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_ptr.htm – Glen

+2

Hangisi? Ve neden zayıf referanslarla ikisini de değiştirmiyorsunuz? Bu gülünç. 'shared_ptr 'bir nedenden ötürü kullanıldı. – curiousguy

+5

@curiousguy: Sorunuzu anladığımdan emin değilim: gülünç olmak için neler buluyorsunuz? Bir döngüyü kırmak için, _one_ güçlü referansı zayıf bir referansla değiştirmeniz gerekir; hangisi tamamen kullanım durumuna bağlıdır. Tüm güçlü referansları zayıf referanslarla değiştiremezsiniz, çünkü hiçbir eşya kalmamış olduğundan tüm nesneler imha edilir. –