2009-02-02 5 views

Antwort

123

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.

+0

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

+0

roe: ich weiß darüber, ich musste nur wissen, bekommen :). Danke Adam! : D –

+1

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

27

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.

+0

Ich mochte deine Antwort nur etwas mehr als Adams, sorry adam. –

+3

@ 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. –

+0

Ich benutze bekommen, aber ich mag immer noch diese Antwort. meistens bc es empfiehlt sowohl was zu tun als auch NICHT zu tun. –