Instanziierung und Freigabe mithilfe von Smart-Pointern

Oktober 10

Raima-Logo auf grauem Hintergrund

Wie im vorherigen Beitrag TBD: LINK beschrieben, haben wir erfahren, dass die C ++ - Schnittstelle für ein bestimmtes Datenbankschema vom Schema-Compiler generiert wird. Diese Schnittstellen bestehen aus einer Reihe von Klassen mit öffentlichen Methoden. Einige Methoden, die mehreren Klassen gemeinsam sind (in einer Basisklasse enthalten), während andere Methoden für eine bestimmte Klasse spezifisch sind (enthalten in einer vom Schema-Compiler generierten speziellen Klasse).

Smart-Pointer

Die Klassen, die die Schnittstelle definieren (API-Klassen), haben eine und nur eine Mitgliedsvariable, einen geschützten Zeiger, der in den Basisklassen deklariert ist. Somit hat jede der beiden Basisklassen einen Zeiger und es gibt keine anderen Mitgliedsvariablen in einer dieser Klassen. Die Objekte hinter diesen Zeigern enthalten den Hauptteil der Implementierung für die API. Diese Objekte werden später Verweise auf Implementierungsklassenobjekte sein.

Die Zeiger auf die Implementierungsklassenobjekte werden als Smart-Pointer (http://en.wikipedia.org/wiki/Smart_pointer) implementiert, deren Implementierung dem Anwendungsentwickler verborgen bleibt. Die Referenzzähler werden in den Implementierungsklassen deklariert, und die API-Klassen verwenden explizite öffentliche Methoden für den Standardkonstruktor, den Kopierkonstruktor, den Zuweisungsoperator und den Destruktor, um dies zu implementieren.

Der Referenzzähler wird auf eins initialisiert, wenn das Implementierungsobjekt instanziiert wird. Die Instanziierung ist immer das Ergebnis einer Methode in einer der aufgerufenen API-Klassen. Für die Db-Schnittstelle ist dies immer eine der Open-Funktionen (in den Db-Schnittstellen als statische Methoden deklariert), und für die Cursor-Schnittstelle gibt es eine Vielzahl von Methoden sowohl in der Db- als auch in der Cursor-Schnittstelle.

Der Referenzzähler wird erhöht, wenn ein zusätzliches Objekt darauf verweist, und dekrementiert, wenn ein Objekt weniger darauf verweist. Wir berücksichtigen nur Zeiger von einem API-Objekt auf ein Implementierungsobjekt und Zeiger von einem Implementierungsobjekt für eine der Cursor-Schnittstellen auf das Implementierungsobjekt für die Db-Schnittstelle. Wenn der Referenzzähler auf Null gesunken ist, wird die Zuordnung des Implementierungsobjekts aufgehoben. Dieses Design stellt sicher, dass die Implementierungsobjekte beibehalten werden, wenn ein Implementierungsobjekt direkt oder indirekt von einem API-Objekt aus referenziert werden kann. Andernfalls wird die Zuordnung aufgehoben.

Der Anwendungsentwickler erstellt dann statische Objektinstanzen der API-Klassen und übergibt sie wie folgt nach Wert:

Cursor_sensor newRecord (Db_myDatabase dbPar) {
Cursor_myRecord cursor = dbPar.New_myRecord_record ();
cursor.Set_name ("Tim");

}

int main (intargc, char * argv []) {

Db_myDatabase db = Db_myDatabase :: Open ();
db.Initialize ();
Cursor_myRecord cursorNew = newRecord (db);

}

Wie im obigen Beispiel gezeigt, werden die API-Klassenobjekte bei jeder Weitergabe instanziiert. Im obigen Beispiel. "Db_myDatabase :: Open ()" instanziiert ein Db_myDatabase-Objekt mit einer Referenzanzahl von eins. Dieses Objekt wird mit dem Kopierkonstruktor verwendet, um db in der Hauptfunktion zu initialisieren und den Referenzzähler auf zwei zu erhöhen. Das erste Objekt, das instanziiert wurde, wird dann zerstört, wodurch der Referenzzähler auf eins zurückgesetzt wird.

Der "newRecord (db)" instanziiert ein weiteres Db_myDatabase-Objekt für den formalen Parameter dbPar, der den Referenzzähler auf zwei erhöht. Die Funktion instanziiert ein Cursor_myRecord-Objekt mit einem Referenzzähler von eins. Diese Instanziierung erhöht auch den Referenzzähler für das Implementierungsobjekt für das Db_myDatabase-Objekt auf drei.

Das Cursor_myRecord-Objekt wird mit dem Kopierkonstruktor verwendet, um den Cursor auf die gleiche Weise zu initialisieren, wie db in der Hauptfunktion initialisiert wurde. Das erste Cursor_myRecord-Objekt, das instanziiert wurde, wird dann zerstört, wodurch der Referenzzähler auf eins zurückgesetzt wird. Eine weitere Instanziierung findet für das Objekt statt, das von der Funktion zurückgegeben wird, wenn der Cursor zerstört wird.

Nachdem die Funktion zurückgegeben und das Cursor_myRecord-Objekt cursorNew zugewiesen wurde, beträgt der Referenzzähler für das Cursor_myRecord-Objekt eins, während der Referenzzähler für das Db_myDatabase-Objekt zwei beträgt.

Wenn die Hauptfunktion db zurückgibt, werden db und cursorNew zerstört, wodurch die Referenzzähler auf Null herabgesetzt werden und beide Implementierungsobjekte zerstört werden.

Nächste TBD: LINK Wir geben einen kurzen Überblick über die API.

Get notified about new RDM updates

Be the first to know about new Raima Database Manager updates when they go live, use cases, industry trends and more.