Ich möchte einfach die Löschfunktion eines shared_ptr ohne den shared_ptr Teil verwenden. Wie in, ich möchte eine Funktion aufrufen, wenn die shared_ptr außerhalb des Geltungsbereichs und der Deleter keinen Zeiger übergeben muss.Wie verwende ich shared_ptr nur für den Deleter?
Ich habe das, aber es ist cheezy.
shared_ptr<int> x(new int, [&](int *me) { delete me; CloseResource(); });
Gibt es eine Möglichkeit, keinen Zeiger mit shared_ptr zu verknüpfen?
Update: wie pro viele Vorschläge, die unique_ptr Weise würde wie folgt aussehen:
unique_ptr<int, std::function<void(int*)>> x(new int, [&](int *me) {delete me; CloseResource();});
Welche offen schlechter als die Shared_ptr Version sieht, wie viel ‚besser‘, wie es ist.
Update: für diejenigen, die diesen einfachen Umfang wie mit der Funktion Anrufer Schließt Ich habe es ein bisschen einfacher, Sie brauchen nicht einmal zu vergeben oder frei ein Objekt:
shared_ptr<int> x(NULL, [&](int *) { CloseResource(); });
'CloseResource' sollte einen Zeiger auf die Ressource akzeptieren, die es schließt – Slava
Warum brauchen Sie einen gemeinsamen Zeiger. Warum nicht nur darauf vertrauen, dass das Objekt seinen Geltungsbereich verlässt? –
Erstens wäre die Verwendung von 'unique_ptr' effizienter (vorausgesetzt, Sie verwenden nicht den Shared-Lifetime-Aspekt von' shared_ptr'). Zweitens, wenn Sie Boost verwenden können, gibt es Boost.ScopeExit, das dies erreicht. Drittens, wenn Sie Boost nicht verwenden können, [können Sie leicht Ihre eigene Klasse erstellen, die dies tut] (http://stackoverflow.com/questions/3669833/c11-scope-exit-guard-a-good-idea) Vermeiden Sie die Hacky-Verwendung von 'unique_ptr' /' shared_ptr'. – Cornstalks