Wie machen Sie std::shared_ptr nicht, rufen Sie delete()

Habe ich-Funktionen, die in std::shared_ptr als argument, so dass ich gezwungen bin, benutze std::shared_ptr, aber die Objekt bin ich der übergabe an die Funktion ist nicht dynamisch zugeteilt. Wie kann ich wickeln Sie das Objekt std::shared_ptr und std::shared_ptr nicht, rufen Sie löschen auf Sie.

  • mögliche Duplikate von Wie zu release-pointer von boost::shared_ptr?
  • nicht ein Duplikat ist, diese Frage hat nichts zu tun mit der boost-library.
  • Außer, dass std::shared_ptr und boost::shared_ptr sind praktisch identisch.
  • boost::shared_ptr war im Grunde der Prototyp für das, was wurde std::shared_ptr.
  • Dies ist eine schreckliche Idee. Der einzige Grund für eine Funktion zu akzeptieren shared_ptr ist, wenn er beabsichtigt, zum speichern eines Verweises auf die pointee (d.h., Aktienbesitz). Ungültig, das Objekt, während die Referenz wird irgendwo gespeichert wird nicht gut gehen. Wenn die Funktion in Frage stellt nicht speichern Sie einen Verweis, sollte es nicht akzeptieren, eine besitzende Zeiger-Typ.
  • Ein Anwendungsfall für diese ist, wo Sie so etwas wie FILE * wo der Typ kann entweder verwaltet werden (z.B. über fopen) oder nicht (z.B. stdin) und Sie haben eine Klasse verwendet, die das Objekt über den Ruf, den Sie erstellt wurden (z.B. die Erstellung einer parser-oder logger). In diesem Fall würden Sie wollen, eine "nichts tun" deleter mit stdin, sondern eine fclose deleter mit einem fopened-Datei.
  • Eine real life-Anwendung, die ich habe über kommen, wo diese Idee Sinn macht, mit einem shared_ptr<ostream>. Vielleicht habe ich eine Funktion, die einen ostream und speichert einen Verweis, um es als einen freigegebenen Zeiger für die spätere Verwendung. Jetzt sagen wir, ich will die Ausgabe auf std::cout. Ich kann nicht löschen std::cout, aber ich kann garantieren, dass es existiert mindestens so lange wie meine Funktion speichert die shared pointer.

InformationsquelleAutor Ken Li | 2013-11-21
Schreibe einen Kommentar