2012-03-28 4 views
3

Nach etwa 10 Jahren der Verwendung von verwalteten Speicher und funktionalen Sprachen, komme ich endlich nach Hause zu C++, und intelligente Zeiger verwirren das Hohn von mir. Die Hälfte der Dokumentation gibt es immer noch bezüglich der veralteten auto_ptr.unique_ptr mit einer API, die rohe Zeiger erwartet?

Ich versuche, diese recht einfach Einschuss "hello world" Programm zu implementieren:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto bp = unique_ptr<btBroadphaseInterface>(new btDbvtBroadphase); 
    auto cc = unique_ptr<btDefaultCollisionConfiguration>(new btDefaultCollisionConfiguration); 
    auto disp = unique_ptr<btDispatcher>(new btCollisionDispatcher(cc)); 
} 

Der btCollisionDispatcher Konstruktor ein btCollisionConfiguration* will, aber ich bin ihm ein unique_ptr ein statt zu geben.

Was möchte ich normalerweise in diesem Fall tun? Wenn es eine Möglichkeit gibt, den Zeiger "unscharf" zu machen, sagt mir etwas, dass unique_ptr nicht der richtige Smart Pointer ist, den man verwenden kann.

enter image description here

C++ war meine Sprache der Wahl, bevor ich auf andere Dinge bewegt. Es ist ein wenig schockierend, zurück zu kommen und zu sehen, dass sich alle Muster und Praktiken komplett verändert haben.

+0

Ich denke, die Antwort hängt von 'btCollisionDispatcher' ab, ob es den Besitz * teilen * oder * übernehmen * will ? Wenn Letzteres - kannst du es nicht ändern, um das "unique_ptr" zu akzeptieren? Wenn das erstere, müssen Sie dies in 'shared_ptr' ändern und das übergeben. – Nim

+0

' disp' wird auf 'cc' festhalten und es verwenden, bis es zerstört ist. Es erwartet, dass Sie es woanders verwenden werden, wie wenn ich später den 'btWorld'-Konstruktor aufrufen werde, aber es teilt den Zeiger nicht außerhalb seines eigenen Bereichs, soweit ich das beurteilen kann. –

+0

Es hängt vielleicht nicht mit Ihrer Frage zusammen, aber wie Sie sagen, Sie kommen aus einem verwalteten Sprachhintergrund, seien Sie sicher, Smartpointer nicht zu sehr zu spammen und immer zuerst den automatischen Speicher in Betracht zu ziehen. Nur ein kleiner, aber wichtiger Rat, der gesagt werden musste. –

Antwort

13

Es gibt eine get() Mitgliedsfunktion, die Ihnen den rohen Zeiger gibt, der von unique_ptr gehalten wird. Dies führt jedoch nicht dazu, dass die unique_ptr die Eigentümerschaft aufgibt, so dass eine ordnungsgemäße Säuberung weiterhin erfolgt (Vorsicht beim Speichern des rohen Zeigers!).

Es gibt auch eine release() Mitgliedsfunktion, die den Besitz aufgibt. Dies bedeutet, dass Sie wieder auf dummem Land sind und die Säuberung liegt in Ihrer Verantwortung.

Ich kann nicht verstehen, warum der Code new in erster Linie verwendet, und nicht just using automatic storage objects, aber ich werde so zu tun, gibt es einen Grund ...

+0

Danke, das kompiliert. Ist in dieser Situation die idiomatische/korrekte Option? –

+1

Wenn der Code, an den Sie den Zeiger übergeben, keine Verantwortung für die Bereinigung übernimmt (die Bullet-Site sieht wie der Fall aus), dann ist 'get()' die richtige Option. –

+0

Ich nehme es dann, dass im Allgemeinen, wenn ich das Objekt erstellen und löschen, ich es besitze - also kann ich 'get()' verwenden? –

3

Die get Memberfunktion der Untergebener Zeiger zurückgibt und Es ist in Ordnung, mit vorhandenem Code zu verwenden, solange dieser Code den von Ihnen übergebenen Speicher nicht verwaltet.