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