Frage

Ist es gültig, eine DLL in C ++ zu entwickeln, dass die Rendite steigert gemeinsame Zeiger und verwenden sie als Parameter?

So ist es in Ordnung, Export-Funktionen wie das?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);

In Sonder: Ist die Referenzzählung Arbeit über DLL Grenzen oder wäre die Voraussetzung, dass exe und dll die gleiche Laufzeit verwenden

Die Absicht ist es, die Probleme mit dem Objekt Eigentum zu überwinden. Also das Objekt gelöscht wird, wenn beide DLL und exe Verweis es nicht mehr.

War es hilfreich?

Lösung

Laut Scott Meyers in Effective C ++ (3rd Edition), sind shared_ptrs über DLL-Grenzen sicher. Das Shared_ptr Objekt hält einen Zeiger auf den destructor aus der DLL, die es erstellt hat.

  

In seinem Buch in Punkt 18 stellt er fest: „Ein besonders schönes Merkmal   tr1 :: shared_ptr ist, dass es seine pro-Zeiger deleter automatisch verwendet   einen weiteren potenziellen Kunden Fehler, die zu beseitigen „Cross-DLL Problem.“   Dieses Problem taucht auf, wenn ein Objekt erstellt wird neu in einem   dynamisch verknüpfte Bibliothek (DLL), aber in einer anderen DLL gelöscht. Auf   viele Plattformen, wie Cross-DLL neu / löschen Paare führen zu Laufzeit   Fehler. tr1 :: shared_ptr das Problem zu vermeiden, weil der Standard deleter   Anwendungen aus dem gleichen DLL löschen, wo die tr1 :: shared_ptr erstellt wird. "

Tim Lesher hat eine interessante Gotcha für, wenn auch zu sehen, dass er erwähnt hier . Sie müssen sicherstellen, dass der DLL, die die shared_ptr nicht erstellt, bevor die shared_ptr schließlich Spielraum erlischt entladen wird. Ich würde sagen, dass in den meisten Fällen ist dies nicht etwas, was Sie zu beachten haben, aber wenn Sie erstellen DLLs, die lose gekoppelt werden, dann würde ich empfehlen, gegen eine shared_ptr verwenden.

Ein weiterer möglicher Nachteil ist dafür, dass beide Seiten mit kompatibelen Versionen der Boost-Bibliothek erstellt. Erhöhung des Shared_ptr hat für eine lange Zeit stabil. Spätestens seit 1,34 es war tr1 kompatibel.

Andere Tipps

Meiner Meinung nach, wenn es nicht in dem Standard und es ist kein Objekt / Mechanismus von Ihrer Bibliothek zur Verfügung gestellt, dann sollte es nicht Teil der Schnittstelle zu der entsprechenden Bibliothek. Sie können Ihr eigenes Objekt zu tun, um die Referenzzählung erstellen, und vielleicht Schub unter verwenden, aber es sollte nicht explizit in der Schnittstelle ausgesetzt werden.

DLLs normalerweise keine eigenen Ressourcen - werden die Ressourcen durch die Prozesse im Besitz, die die DLL verwenden. Sie sind wahrscheinlich besser dran, einen einfachen Zeiger zurückkehrt, die Sie dann auf der rufenden Seite in einem gemeinsamen Zeiger speichern. Aber ohne weitere Informationen ist es schwer, über diese zu 100% sicher zu sein.

Etwas zum Ausschau nach, wenn Sie rohe Zeiger aus einer DLL-Schnittstelle aus. Es zwingt Sie den freigegebenen DLL CRT, Speicher in einem CRT zugeordnet zu verwenden, kann nicht in einer anderen CRT freigegeben werden. Wenn Sie die gemeinsam genutzte DLL-CRT in allen Ihre Module (DLL & exe), verwenden Sie dann, Sie sind fein, sie alle den gleichen Haufen, wenn Sie nicht erhalten Sie CRTs überqueren und die Welt wird meltdown.

Abgesehen von diesem Problem, bin ich mit der akzeptierten Antwort. Die Schaffung Fabrik wahrscheinlich sollte nicht definieren Eigentum & Lifecycle Management für den Client-Code.

Nein, es ist nicht.

Das Layout boost::shared_ptr<T> möglicherweise nicht das gleiche auf beiden Seiten der DLL-Grenze. (Layout von Compilerversion beeinflusst wird, Pragmas und andere Compiler-Optionen, sowie die aktuelle Version des Boost-Quellcode zu packen.)

Nur "Standard-Layout" (ein neues Konzept in C ++ 11, bezogen auf das alte "POD = plain old data" Konzept) Typen sicher zwischen separat gebauten Module übergeben werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top