Ich habe so etwas wie shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Ich muss jetzt C-formatierte Funktion aufrufen, die einen Zeiger auf Type
erfordert. Wie bekomme ich es von shared_ptr
?Erhalten eines normalen ptr von shared_ptr?
Antwort
Verwenden Sie die get()
Methode:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Stellen Sie sicher, dass Ihre shared_ptr
nicht außerhalb des Bereichs geht, bevor die Bibliotheksfunktion mit ihr geschehen ist - sonst Schlechtigkeit könnte zur Folge haben, da die Bibliothek kann versuchen zu tun etwas mit dem Zeiger, nachdem es gelöscht wurde. Seien Sie besonders vorsichtig, wenn die Bibliotheksfunktion eine Kopie des unformatierten Zeigers nach der Rückgabe beibehält.
Eine andere Möglichkeit wäre es, zu verwenden, um eine Kombination der &
und *
Betreiber zu tun:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function(&*foo_ptr);
Während ich persönlich würde die get()
Methode verwenden möchten (es ist wirklich die richtige Antwort), ein Vorteil Das ist, dass es mit anderen Klassen verwendet werden kann, die operator*
(Zeigerdereferenz) überladen, aber keine Methode get()
bereitstellen. Kann zum Beispiel in einer generischen Klassenvorlage nützlich sein.
Ich mochte deine Antwort nur etwas mehr als Adams, sorry adam. –
@ acidzombie24 - Ich bin mir nicht sicher, warum dir das besser gefällt. Die Get() - Methode ist besser in wahrscheinlich 99% oder mehr der Fälle zu verwenden. –
Ich benutze bekommen, aber ich mag immer noch diese Antwort. meistens bc es empfiehlt sowohl was zu tun als auch NICHT zu tun. –
Sie sollten vielleicht etwas über die shared_ptr außerhalb des Geltungsbereichs beachten, bevor die c_library_function ihre Sache mit dem raw_foo getan hat. – falstro
roe: ich weiß darüber, ich musste nur wissen, bekommen :). Danke Adam! : D –
Hi @Adam Rosenfield, könnten Sie erklären, was in einem Szenario passiert, in dem eine Ausnahme in 'c_library_function' auftritt. Das bedeutet, dass das rohe_foo bleibt hängen gelassen? Oder geht foo_ptr voran und löscht den raw_foo, da raw_foo von foo_ptr gehalten wird? – thassan