Was ist der Unterschied zwischen Auto-Zeigern und freigegebenen Zeigern in C ++?

8

Ich habe gehört, dass Autozeiger ihr Objekt besitzen, während geteilte Zeiger viele Objekte haben können, die auf sie zeigen. Warum benutzen wir nicht ständig geteilte Zeiger?

In Bezug auf das, was intelligente Zeiger sind, verwenden Leute diesen Ausdruck austauschbar mit geteilten Zeigern. Sind sie gleich?

    
shreyasva 05.12.2011, 12:31
quelle

3 Antworten

18

std::auto_ptr ist eine veraltete, veraltete Implementierung exklusiver Zeigereigentümer. Es wurde in C ++ 11 durch std::unique_ptr ersetzt. Exklusives Eigentum bedeutet, dass der Zeiger Eigentum von etwas ist und dass die Lebensdauer des Objekts an die Lebensdauer des Eigentümers gebunden ist.

Gemeinsam genutzte Zeiger ( std::shared_ptr ) implementieren den Besitz eines gemeinsamen Zeigers - sie halten das Objekt am Leben, solange es aktive Referenzen darauf gibt, weil es keinen einzelnen Besitzer gibt. Dies geschieht in der Regel mit Referenzzählung, was bedeutet, dass sie im Gegensatz zu eindeutigen Zeigern zusätzlichen Laufzeitaufwand haben. Auch die Argumentation über das Miteigentum ist schwieriger als das Nachdenken über ausschließliches Eigentum - der Punkt der Zerstörung wird weniger deterministisch.

Der intelligente Zeiger ist ein Begriff, der alle Typen umfasst, die sich wie Zeiger verhalten, jedoch mit einer (intelligenten) Semantik im Gegensatz zu roher T* . Sowohl unique_ptr als auch shared_ptr sind intelligente Zeiger.

    
Cat Plus Plus 05.12.2011, 12:38
quelle
2

Gemeinsame Zeiger sind etwas teurer, da sie eine Referenzzahl enthalten. In einigen Fällen, wenn Sie eine komplexe Struktur mit einem gemeinsamen Zeiger auf mehreren rekursiven Ebenen haben, kann eine Änderung die Referenzanzahl vieler dieser Zeiger berühren.

Auch in Multiple-CPU-Core-Architekturen kann die atomare Aktualisierung eines Referenzzählers nicht nur geringfügig, sondern auch wirklich kostenintensiv werden, wenn der Multiple-Core gerade auf denselben Speicherbereich zugreift.

Freigegebene Zeiger sind jedoch einfach und sicher zu verwenden, während die Zuweisungseigenschaften von Auto-Zeigern verwirrend sind und sehr gefährlich werden können.

Intelligente Zeiger werden normalerweise häufig nur als ein Synonym für einen geteilten Zeiger verwendet, sie decken jedoch alle verschiedenen Pointer-Implementierungen in Boost ab, einschließlich desjenigen, der geteilten Zeigern ähnelt.

    
jmd 05.12.2011 12:39
quelle
1

Es kann viele Formen von intelligenten Zeigern geben. Boost inspiriert shared_ptr, das jetzt in C ++ 11 ist, ist einer von ihnen. Ich schlage vor, im Zweifelsfall an fast allen Stellen shared_ptr anstelle von auto_ptr zu verwenden, das viele Macken hat.

Kurz gesagt, shared_ptr ist nur eine Referenzzählung, um dasselbe Objekt zu teilen.

Siehe: Ссылка http://en.cppreference.com/w/cpp/memory/shared_ptr

    
Aditya Kumar Pandey 05.12.2011 12:38
quelle