Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Eine eigene String-Bibliothek

Die Speicherverwaltung untersuchen

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
String-Manipulationen bewirken ein ständiges Hin und Her im Hauptspeicher und sind damit besonders kritisch zu betrachten, wenn es um Memory Management geht. Wie Bill Weinman diese Probleme löst, darum geht es in diesem Video.
05:03

Transkript

Die Klasse BWString verwaltet zwei Datenobjekte. Hier habe ich eine Arbeitskopie der Klasse BWString aus den Übungsdateien. Das String selbst wird in einem C String gespeichert. Und somit gibt es hier einen char-Zeiger und das String selbst wird dynamisch zugeordnet. Es gibt einen eigenen Längenparameter, der in einem size_t-Objekt gespeichert ist, das die Länge des Strings verfolgt. Außerdem gibt es ein Array, das die Ergebnisse einer String-Zerlegung aufnimmt und dieses wird in einem Unique Pointer Array von Shared Pointers gehalten. Wie hier zu sehen ist, habe ich Type Depths für diese beiden Zeiger geschrieben, sodass sie einfacher zu verwenden sind. Außerdem sei erwähnt, dass der Typ Split Pointer ein Unique Pointer des Typs _bwsp ist, der ein Shared Pointer von BWStrings ist. Und sicherlich haben Sie auch diese eckigen Klammern gesehen, wodurch dies zu einem Array wird. Dieses Split Array-Objekt und auch dieses size_t-Objekt, um den Zähler zu verfolgen, sind als mutable markiert. Das erlaubt uns einen String mit einer konstanten qualifizierten Methode zu zerlegen. Und dies werde ich Ihnen gleich zeigen. Hier in der .cpp-Datei ist zu sehen, dass der Speicher für den String in dieser alloc_str-Methode alloziert wird. Und dies ist ziemlich unkompliziert. Wenn es bereits einen String gibt, ruft sie Reset auf. Das löscht den String und setzt das BWString-Objekt in seinen Standardzustand zurück. Dann nimmt sie die _str_len und dies ist wieder das size_t-Objekt im Objekt hier. Machen wir das ein wenig größer. Und sie nimmt diese Länge und wenn diese übergebene Größe größer als unser Maximum ist, setzt sie sie auf das Maximum. Andernfalls, setzt sie sie auf die übergebene Größe. Dann weist sie Speicherplatz in _str zu und auch hier ist _str dieser Zeiger, wo wir unseren String tatsächlich speichern. Und sie weist Speicher mit Hilfe von New zu. Und auch hier stehen die Klammern nach der New-Allokation, was den Speicher mit Nullen füllt. alloc_str wird immer nur von cpy_str aufgerufen, die hier unten zu sehen ist. Und cpy_str wird immer verwendet, um den String mit Daten zu füllen. Das geschieht niemals außerhalb von cpy_str und somit bleibt die Datenverwaltung für den String-Puffer einfach und sauber. Das Split Array ist ein wenig komplizierter, wenn auch nicht viel. Ich wollte keinen STL-Vektor verwenden, weil das die ganze Container- Unterstützung der STL eingebracht und den Zweck dieser Klasse größtenteils zunichte gemacht hätte. Deshalb habe ich dieses Array eingeführt, als ich die Funktionalität für die String- Zerlegung in die Klasse eingebaut habe. In Zukunft werde ich wahrscheinlich dieses ganze Array in eine eigene Klasse auslagern. Die Strings, die während der String-Zerlegung entstehen, werden als Array von Shared Pointer auf BWString-Objekte gespeichert und auf das Array selbst wird über einen Unique Pointer zugegriffen. Deshalb werden diese Typen hier mit den typedefs definiert. Dies ist der Shared Pointer und dies ist das Unique Pointer Array. Den Unique Pointer habe ich für das Array aus verschiedenen Gründen gewählt. Zuallererst ist es wichtig, dass diese Klasse tatsächlich den Speicher für das Array verwaltet. Dadurch kann ich die Speicher-Allokation für die separaten BWString-Objekte steuern. Zweitens, ist der Unique Pointer die einzige Klasse intelligenter Zeiger, die ein Array nativ unterstützt. Und das spart mir komplexe Konstrukte, was den Zugriff auf die Elemente des Arrays angeht. Der Speicher für das Array wird in _append_split_array verwaltet. Und dies sind hier private Methoden: _append_split_array und reset_split_array. Wenn wir also hier zur unseren .cpp-Datei kommen, werden Sie sehen, dass _append_split_array tatsächlich den Speicher für jedes Objekt alloziert. Hier wird dieser intelligenter Zeiger, der Shared Pointer, verwendet, der den Typ _bwsp hier hat. Und dann verwendet sie make_shared, um tatsächlich den Speicher oder vielmehr den Shared Pointer zu allozieren, der im Split Array gespeichert ist. Und dann erhüllt sie den Zähler in Inkrementen. _reset_split_array andererseits durchläuft das gesamte Split Array und ruft Reset für jedes Element im Split Array und dann für das gesamte Array auf. Es ist wichtig, dass wir nicht einfach das gesamte Array zurücksetzten, ohne die einzelnen Elemente im Array zurückzusetzen. Die eigentliche Funktionalität der Split-Funktionen gehen wir später in diesem Kurs durch. Doch momentan ist es wichtig zu verstehen, dass die Auswahl Ihrer Datenstrukturen und die Gestaltung einer Speicher-Verwaltungsstrategie einen wichtigen Teil bei der Definition einer Klasse ausmachen. In diesem Fall habe ich alles so einfach wie möglich gehalten. Ich hätte es noch weiter vereinfachen können, indem ich die Array-Verwaltung in eine eigene Vektor-Klasse ausgelagert hätte, was ich wahrscheinlich in einer zukünftigen Version dieses Projekts tun werde.

C++: Eine eigene String-Bibliothek

Erstellen Sie eine eigene String-Bibliothek als hundertprozentigen Ersatz für die String-Bibliothek der C++-STL.

37 min (10 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:21.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!