Mit std::make_unique mit einer custom deleter
In mit std::unique_ptr
mit einer custom deleter habe ich den Wunsch verwenden std::make_unique
eher als eine raw-neue. Ich bin mit VC++2013. Es scheint mir, dass es keine Möglichkeit gibt, zu verwenden std::unique_ptr
wenn Sie einen custom deleter. Habe ich irgendwas übersehen oder ist das wirklich der Fall?
Zusätzliche Informationen:
Ich bin mit einem std::unique_ptr<HANDLE, custom_deleter>
zu halten, ein Windows-HANDLE des geöffneten COM-port.
Dass ich schreiben konnte, eine benutzerdefinierte RAII-Klasse für diese, und wäre es nicht furchtbar schwer, aber ich war zu sehen, wie hart/schwer/schlecht es wäre std::unique_ptr
.
InformationsquelleAutor der Frage Graznarak | 2014-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ganzen Punkt
make_unique
ist zum einkapseln der Begriff der "Verwendungnew
zu erstellenT
aus gegebenen Argumente im Konstruktor und verwendendelete
es zu zerstören".Wenn Sie wollten einen custom deleter, Sie würde auch noch angeben, wie erstellen das Objekt, und dann würde es nichts mehr gewonnen, dass die emplacing-maker-Funktion.
Schrieb ich einige Beispiele für custom maker Funktionen für bestimmte, einzigartige Ressource behandelt in diesem Beitrag.
InformationsquelleAutor der Antwort Kerrek SB
Hier ist ein Weg, um wrap-c-Stil-memory-management in einem
std::unique_ptr
mit einer custom deleter, ruft eine benutzerdefinierte Kostenlose Funktion. Dieser verfügt über die Funktion helper ähnlichstd::make_unique
LIVE:Möglich-Ausgang:
InformationsquelleAutor der Antwort Jon Ringle
Soweit ich weiß, gibt es keine
make_unique
- Funktion in der C++11 standard. SehenAlso ich würde davon ausgehen, dass die
make_unique
ist eine Implementierung von Microsoft, zumindest nicht in den standard aufgenommen.Aber dennoch können Sie einen custom deleter mit
unique_ptr
. Bei der Verwendung vonunique_ptr
müssen Sie die Art von der Streicher als zweites template-argument und übergeben Sie dann ein geeignetes Objekt an den Konstruktor.InformationsquelleAutor der Antwort sleepy42