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?
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()
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