2009-05-21 11 views
0

Ich versuche zu verstehen, was im folgenden Code vorgeht. Wenn Objekt-A gelöscht wird, bleibt Shared_ptr Member Variable Objekt-B im Arbeitsspeicher, weil Objekt-C ein Shared_ptr zu Objekt-B enthält?boost :: shared_ptr use_count

class B 
    { 
    public: 
     B(int val) 
     { 
      _val = val; 
     } 
     int _val; 
    }; 

    class A 
    { 
    public: 
     A() 
     { 
      _b = new B(121); 
     } 
     boost::shared_ptr<B> _b; 
    }; 

    class C 
    { 
    public: 
     C() 
     { 
     } 

     void setRef(boost::shared_ptr<B> b) 
     { 
      _b = b; 
     } 
     boost::shared_ptr<B> _b; 
    }; 

    int main() 
    { 
     C c; 
     { 
      A *a = new A();  
      cout << "a._b.use_count: " << a->_b.use_count() << endl; 
      c.setRef(a->_b); 
      cout << "a._b.use_count: " << a->_b.use_count() << endl; 
        delete a; 
     } 
     cout << c._b->_val << endl; 
    } 

Antwort

1

Das A-Objekt wird bereinigt, sobald a am Ende seines Blocks gelöscht wird. Aber das shared_ptr, das es enthält, wurde anschließend kopiert, wodurch seine Referenzzählung inkrementiert wurde.

Somit ist die B -object einen Referenzzähler von 2 nach c.setRef hat (bezogen von der A -object und durch die C -object die shared_ptr). Wenn a am Ende seines Blocks gelöscht wird, dann fällt der Referenzzähler des B-Objekts wieder auf 1, da nur noch share_ptr von c darauf verweist.

Nach c ist am Ende des Haupt zerstört, seine shared_ptr wird auch als Teil der c ‚s Zerstörung zerstört werden, und wird nun als der Referenzzähler auf Null abfällt, wird der spitz zulauf-to B Objekt durch shared_ptr gelöscht.

So werden die Referenz Zählungen des B -object:

0: before existence of a. 
1: from start of lifetime of a until c.setRef 
2: from c.setRef until copy of its parameter 
3: from copy of c.setRef''s parameter until return of it 
2: from return of c.setRef until end of a''s block 
1: from end of a''s block until end of main 
0: after main returned (object doesn''t exist anymore now) 
0

Das Ziel der shared_ptr wird live bleiben, bis der letzte Verweis darauf gestrichen. In diesem Fall ist dies der Fall, wenn die C Instanz den Gültigkeitsbereich verlässt.

2

Nein, wenn a gelöscht wird, hört a -> _ b (der Zeiger selbst) auf zu existieren.

Das Objekt, auf das ein -> _ b zeigt, wird weiter bestehen, weil c._b immer noch darauf zeigt.

Verwandte Themen