Frage

Ich versuche zu verstehen, was in den folgenden Code vor sich geht. Wenn Objekt-a gelöscht wird, tut es Shared_ptr Membervariable Objekt-b in Erinnerung bleibt, weil objekt c ein shared_ptr hält zu-b-Objekt?

    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;
    }
War es hilfreich?

Lösung

Das A-Objekt wird so bald aufgeräumt wie a am Ende seines Blockes gelöscht. Aber die Shared_ptr es wurde anschließend kopiert enthält, dessen Referenzzähler erhöht wird.

Damit das B-Objekt einen Referenzzähler von 2 nach c.setRef (von dem A-Objekt und durch das C-Objekt shared_ptr bezeichnet) hat. Wenn a am Ende seines Blocks gelöscht wird, dann fällt die Referenzzählung des B-Objekt wieder 1 da nur c der shared_ptr ist es jetzt verweist.

Nach c am Ende der Haupt zerstört wird, wird sein shared_ptr auch zerstört werden als Teil c Zerstörung und jetzt als der Referenzzähler auf Null sinkt, das spitze-to B Objekt wird durch shared_ptr gelöscht werden.

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

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)

Andere Tipps

Nein, wenn ein gelöscht wird, ein. -> _ b (der Zeiger selbst) wird aufhören zu existieren

Das Objekt , dass a. -> _ b Punkte werden weiterhin bestehen, weil c._b noch darauf verweist

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top