2016-04-25 10 views
1

Während in den libssh library Lesen, sah ich, dass sie die Zuweisung-it-ausplanen-it Muster speziell sagenWarum XXXX_new und XXXX_free über neue und löschen?

libssh folgt. Jedes Objekt, das Sie ordnen mit xxxxx_new() muss mit xxxxx_free freigegeben werden()

Ist das etwas, das von ihm kommt eher eine C-Bibliothek ist als eine C++ Bibliothek, in der neue und löschen nicht vorhanden oder ist es ein allgemeine Praxis, um neue zu vergessen und zu löschen und manuell erstellen und löschen Sie Objekte mit den xxxx_new und xxxx_free Muster? Wenn es eine gängige Praxis ist, was sind die Vorteile gegenüber new und delete und den Konstruktoren und Destruktoren, die aufgerufen werden?

[EDIT] Hinzugefügt den Link zu, wo ich dies als <a> Tag auf "libssh Bibliothek" für diejenigen, die Fragen lesen.

+0

Haben Sie einen Link, wo Sie das gelesen haben? – Default

+1

Abgesehen davon, dass es sich um eine C-Schnittstelle handelt, besteht die Hauptunterscheidung darin, dass sie ändert, wer die Objekterzeugung steuert - den Konsumenten gegenüber der Bibliothek. Mit dieser Schnittstelle steuert die Bibliothek mehr, wodurch sie mehr Leistung erhält (z.Protokollierung, Haltepunkte, globale Konfiguration, Vermeidung von nicht übereinstimmenden 'neuen' und' delete' Aufrufen aus verschiedenen DLLs usw.) – Cameron

+0

ssh_new pairs mit ssh_free, ssh_scp_new Paare mit ssh_scp_free, ssh_string_new Paare mit ssh_string_free, ssh_event_new Paare mit ssh_event_free. Jeweils die allocate- und die free-Funktionen für Session-, scp-, string- und event-Objekte isoliert die Details der Allokator- und Objektimplementierung. Die C++ - Neu- und -Deleteoperatoren sind in einer C-Bibliothek nicht nützlich. –

Antwort

3

Ein erster Blick auf den von Ihnen bereitgestellten Link zeigt, dass libssh die xxxx_new()-Funktionen als kombinierte Zuweisungs-/Konstruktoraufrufe verwendet. Es ist wirklich nur eine Standardbenennung von Fabrikfunktionen. Gleichermaßen wirkt xxxx_free() als eine Destruktor/Deallokator-Kombination.

Die Kombination von Zuweisung und Konstruktion in einem einzigen Funktionsaufruf ist immer dann sinnvoll, wenn eine Bibliothek typensichere opake Zeiger auf ihren Benutzercode bereitstellen will: Um den Benutzercode zu kompilieren, muss der Compiler nur wissen, dass der Typ existiert und existiert unterscheidet sich von jedem anderen Typ. Es besteht keine Notwendigkeit, die vollständige Deklaration in einem öffentlichen Header zu haben.

Dieser Ansatz ist nicht sehr beliebt in C++ - Bibliotheken, weil sie im Allgemeinen ihre Objekte wie ein normales C++ - Objekt verhalten wollen (was bedeutet, dass die Pointer/Referenzen nicht für den Compiler undurchsichtig sein sollten). Aber wenn eine Bibliothek eine C-Schnittstelle zur Verfügung stellt, machen solche Factory-Funktionen es unwahrscheinlich, dass Sie merkwürdige Fehler bekommen, weil Benutzer Zeiger auf nicht initialisierte Objekte übergeben (vergessener Konstruktoraufruf) oder die Zuweisung Ihrer Objekte durcheinander bringen.

-1

Ist das etwas, das von ihm eher als eine C++ Bibliothek, in der neue und löschen nicht existierte

Wahrscheinlich ja ist eine C-Bibliothek kommt. Es müssen oft mehr Initialisierungen durchgeführt werden als die reine Speicherzuweisung, wie sie mit malloc() in c-Code verfügbar ist. Es ist ähnlich wie new ruft Konstruktoren class/struct Instanzen erstellt.

oder ist es eine gängige Praxis, neue Objekte zu löschen und manuell Objekte mit dem Muster xxxx_new und xxxx_free zu erstellen und zu löschen?

Nein, das ist nicht üblich in C++.

Die Möglichkeit, mit dynamisch zugewiesenen Instanzen und Eigentumsrechten umzugehen, besteht darin, die Funktionen und Smart-Pointer-Klassen aus den Standard-C++ Dynamic memory management-Dienstprogrammen zu verwenden.