Warum gibt es keinen std::shared_ptr Spezialisierung?

Lesezeit: 3 Minuten

Warum gibt es keinen stdshared ptr Spezialisierung
Kennzeichen

Der Standard sieht eine Vorlagenspezialisierung von vor std::unique_ptr die richtig ruft die delete[] von seinem Destruktor:

void func()
{
   std::unique_ptr< int[] > arr(new int[10]);

   .......
}

Mit std::shared_ptr Diese Spezialisierung ist nicht verfügbar, daher ist es notwendig, einen Löscher bereitzustellen, der korrekt aufruft delete[]:

void func()
{
    // Usage
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; } ); 

    ..............
}

Ist das einfach ein Versehen? (so wie es eine gibt std::copy_if) oder gibt es einen Grund?

  • Hinweis: Es gibt einen neuen Vorschlag, dies für C++17 hinzuzufügen, basierend auf der Arbeit in Boost, siehe open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3640.html

    – Jonathan Wakely

    24. November 2013 um 17:53 Uhr

  • Beachten Sie, dass viele der shared_ptr Maschinen sollten deaktiviert werden, wenn mit Arrays gearbeitet wird, z. B. die Möglichkeit, auf ein Unterobjekt zu verweisen.

    – Ben Voigt

    26. November 2014 um 5:54 Uhr

Warum gibt es keinen stdshared ptr Spezialisierung
Howard Hinnant

Die LWG (Library Working Group des C++-Komitees) hat kurz über die Möglichkeit nachgedacht, aber die Idee war nicht unumstritten. Obwohl sich die Kontroverse hauptsächlich um ein Feature drehte, das dem hinzugefügt wurde shared_ptr<T[]> Vorschlag, der hätte fallen gelassen werden können (Arithmetik auf shared_ptr<T[]>).

Aber letztendlich ist der eigentliche Grund, dass, obwohl es diskutiert wurde, es nie einen tatsächlichen schriftlichen Vorschlag vor der LWG gab, dies zu tun. Es hat nie die Prioritätenliste von jemandem (einschließlich meiner eigenen) so weit in die Höhe getrieben, dass ich genug Zeit hätte, um einen Vorschlag zu schreiben.

Unter einigen LWG-Mitgliedern haben vor kurzem wieder informelle Gespräche zu diesem Thema begonnen, und ich habe persönlich einen Prototypen erstellt. Aber es gibt noch keinen schriftlichen Vorschlag dafür. Ich denke, es wäre ein anständiges zusätzliches Tool in der Toolbox. Ob es jemals tatsächlich passieren wird oder nicht, ist unklar.

Aktualisieren

Array-Unterstützung für shared_ptr hat jetzt einen Entwurf TS:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

Aktualisierung (2017)

Dies wird jetzt in C++17 unterstützt. Siehe Fall 3 von shared_ptr::shared_ptr()

  • Erste Frage “Warum gibt es nicht …” mit einer echten Antwort, die ich auch gesehen habe, ein dynamisch zugewiesenes Array? Mit vector und std::array sehe ich wirklich nicht die Notwendigkeit (?)

    – Nim

    20. Januar 2012 um 20:58 Uhr

  • @Nim: std::unique_ptr<T[]> (das vorhanden ist) ist gut, wenn Overhead für Sie enorm wichtig ist. nicht wie vector<T>, unique_ptr<T[]> enthält keinen Overhead für Kapazität oder sogar Größe. Der Client muss wahrscheinlich externen Overhead für die Größe hinzufügen, aber wenn die Größe des Arrays nie geändert wird, nicht für die Kapazität. Jetzt macht das nicht unique_ptr<T[]> ein besseres vector<T>. In der Tat denke ich, dass die Anwendungsfälle des ersteren im Vergleich zum letzteren selten sein werden. Aber die Use-Case-Rate ist für Ersteres nicht null.

    – Howard Hinnant

    21. Januar 2012 um 1:47 Uhr

  • Analog, shared_ptr<T[]> kann manchmal ersetzen shared_ptr<vector<T>> mit geringerem Overhead. Die bloße Existenz und fortgesetzte Unterstützung von boost::shared_array<T> ist ein Argument dafür, dass einige Programmierer ein solches Werkzeug gelegentlich nützlich finden.

    – Howard Hinnant

    21. Januar 2012 um 1:47 Uhr

  • @sellibitze: Der Nutzen der shared_ptr<T[]> Version ist, dass nur eine Zeiger-Dereferenzierung erforderlich ist, um zu einem der Array-Elemente zu gelangen, while shared_ptr<vector<T>> erfordert zwei (eine für die shared_ptreine für das Array, das in gespeichert ist vector).

    – Jeremia Willcock

    10. März 2012 um 20:10 Uhr

  • Gibt es einen Grund, warum anscheinend jeder shared_ptr> ignoriert? Gibt es einen Nachteil im Vergleich zu shared_ptr das habe ich übersehen?

    – MikeMB

    26. November 2014 um 7:55 Uhr

933440cookie-checkWarum gibt es keinen std::shared_ptr Spezialisierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy