Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++

Speicherbereiche anlegen und freigeben (malloc und free)

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Speicherbereiche während der Laufzeit anlegen und darauf zugreifen, das zeigt Ihnen der Trainer in diesem Film. Er erklärt Ihnen auch die Verwendung des Befehls "free", der diesen Speicher wieder freigibt.

Transkript

Bei der Verwendung von Pointern taucht ein solches Problem auf, wie reserviert man Speicher, damit man mit diesen Pointern was Vernünftiges tun kann und nicht nur einfach eine Copy von bestehendem Speicher verwendet. Das geschieht relativ einfach. Da gibt es aber zwei Möglichkeiten, nämlich die klassische C Variante oder die C++ Variante, und ich zeige Ihnen erst mal die klassische Version, weil die immer noch sehr häufig verwendet wird. Hier haben wir iostream includet und auch cstring, ein bisschen mit Strings machen. Und ich zeige Ihnen mal jetzt, wie man so einen Speicher anliegt. Wir wollen nämlich den Inhalt von cbuff mit "Hallo Welt" kopieren nach C-Pointer. Jetzt können wir natürlich einfach einen Zeiger drauf legen, aber das ist nicht die Idee von der Geschichte, wir wollen einen gedrehnten Speicher dafür verwenden. Dann mache ich Folgendes. Ich muss hier einen Type-Cast, ich muss jetzt mal mit dem klassischen, nämlich mit den klassischen Befehlen verwenden. In malloc liegt Speicher fest, liegt Speicher an, und zwar mit aus dem sogenanten HIP-Bereich. Der Compiler unterscheidet da verschiedene Bereiche, oder das System ist Betriebsystem, Den Stack, das ist alles, was dynamisch hier angeliegt, wird auf den sogenannten Stack. Denn haben wir den globalen Speicherbereich für feste Variablen, die ich hier statisch anliege, und den HIP für die dynamische Objekte. Der liegt irgendwie im Prinzip dazwischen, wie wachsen gegeneinander der HIP-Stack nach oben und der Stack nach unten. Wenn sie beide sich treffen, dann haben wir keinen Speicher, mehr geht es um ein out of memory. Also hier liegen wir mal mit malloc den String an, und zwar mit strlen, die Länge muss ich ihm natürlich sagen, wie viel Speicher möchte ich gerne haben. strlen von cbuff - das ist genau das "Hallo Welt", aber ganz wichtig, wenn man mit c-Strings arbeitet, immer 1 dazu für das 0 Zeichen. So, und jetzt kann ich anschließend mit strcpy, und da nehme ich diese Secure-Version, sichere Version, nach cptr kopieren. So, und dann muss ich hier noch die Länge angeben, das ist jetzt genau wie oben, dass kann ich mal kopieren die Größe + 1, weil wegen der Null, wie gesagt, das ist damit die maximale Größe. So, ich nutze Überprüfung, und die Quelle ist cbuff. Und dann kann ich eigentlich hier cout << cptr << endl das Ganze ausgeben und anzeigen. Nun haben wir noch nicht alles erledigt. Das sollte man sich gleich angewöhnen. C-Pointer reserviert einen Speicher, der so nicht freigegeben wird, ihn muss ich im Schluss des Programmes, wenn es irgendwie geht, freigeben, mindestens aber im Programm mit den Funktionen arbeite, damit der Speicher nicht leer herumliegt. Hier wäre es nicht so kritisch, aber normalerweise muss man aufpassen, wenn man hat hier eine Schleife,denn würde da immer mehr, mehr Speicher verbraucht. bis es eben zum Überlauf kommt. So, ich starte jetzt das Ganze mal ohen Debug, und hier habe ich die "Hallo Welt" Da passiert eigentlich jetzt gar nichts Aufregendes. Man sieht, dass ich hier den cptr, den könnte ich hier jetzt weiter verwenden, das machen wir jetzt auch mal, und zwar kopieren wir jetzt in den cptr hier was rein, möchte ich Ihnen zeigen auch, dass wir wirklich auf eine Kopie arbeiten, machen wir mal von mir aus A, und dann gebe ich einmal, auch kopiere mich den Schnitt hier schneller, cptr aus, und den cbuff nehme ich an dieser Stelle noch mal aus. Schauen wir mal! Und da habe ich wieder falsch geklickt, dann siehe mal das. Hier "Hallo Welt", das ist unser geänderte String, und hier ist aber immer noch der Originalstring vorhanden, cbuff haben wir natürlich durch diese Prozedur nicht verändert, weil ich eben, wie gesagt, hier einen neuen String angeliegt habe, einen neuen Speicherbereich für String, um es genau zu sagen. Also, das ist dann kein Problem. Auf die andere Weise kann ich natürlich auch ganz andere Daten anlegen. Das machen wir jetzt mal hier long *pl - ein Langfeld, nenne ich also, pl soll sein ein Datenfeld, und zwar muss ich hier natürlich denn auch sagen, ich brauche hier einen Pointer auf ein Longbereich in malloc, und da möchte ich gern 1000 Elemente unterbringen, mal (*), und jetzt muss ich aber unbedingt hier noch, sei es auf long mit herein multiplitzieren, sonst ist das Feld unter Umständen zu klein. Jetzt kann ich mir mit einer for Schleife int i=0; i<1000;, da muss man aufpassen, es empfiehlt sich hier, mit die feine Konstante zu definieren, die man dann da verwenden kann, aber wenn man hier nicht mit absoluten Zahlen arbeiten muss, und wenn da macht man so, p1 [i] = (na ja, von mir aus) i * i, bin ich etwas fantasielos, und das Ganze gehen wir am Schluss, nachdem es eingespeichert wurde, auch wieder aus cout, da nehme ich hier einfach das hier und mache da aber hier hinten noch ein Leerzeichen dran, sonst wird es gar unübersicht, und was man natürlich auch jetzt nicht vergessen darf, den Pointer brauchen wir hier nicht mehr, jedem mal frei. Dafür wir nichts hintereinander machen, muss man aufpassen, was kann da zu einer Schutzverletzung führen und davon nur einmal freigeben, es emfiehlt sich, hier 0 zuzuweisen, solange man auch keine malloc gemacht hat. Dann passiert die hier unten, die nur auf 0 abfragen kann. Was hier auch passieren kann, ist, dass dann nur 0 rauskommt, wenn kein Speicherbereich nicht mehr vorhanden ist. Bei älteren c-Compiler war das so, bei den neueren gibt es Ebene entsprechender Fehlermeldung. Da gibt es auch noch andere Möglichkeiten, hier einen Speicherbereich anzulegen. Muss man aufpassen bei new und delete, das ist das, was ich Ihnen hier noch zeige. Da sind die Regeln bisschen anders hier, sollte man eigentlich dann imme auf 0 abfragen, dann kann da nichts passieren. Zeige ich das noch mal das an. Da haben wir noch einmal einen Fehler angebaut. Da gibt es ein paar ärgerliche Geschichten. hier eins nicht deklariert, das ist so wenig typisch. Hier oben pl genannt, hier habe ich p1 genannt. Das kann man so nicht unterscheiden. Man sollte mit l und 1 ein bisschen vorsichtig sein. Kopiere das jetzt mal, schauen wir mal, probiere es mal, aber noch was. Jetzt wird es echt unübersichtlich bei der Geschichte, als ich nehme mal den, kopiere den hierher, kopieren ihn hier rein, kopiere ihn hier rein und kopiere ihn hier rein. So. Niemals [] nehmen. Ich mache den Fehler auch immer wieder, jetzt war es endlich. Da kommen jetzt jede Menge Zahlen, die Quadratzahlen hier im Prinzip raus. Und wenn wir jetz zurückscrollen ganz nach oben, so ist es Hallo - Geschichte noch, und hier habe ich hier jeweils Quadrat abgespeichert in diesem Riesenfeld. Also, auf diese Art und Wiese kann man mit Pointern arbeiten, Speicherbereiche zuweisen und Speicherbereiche auch wieder freigeben.

C++

Machen Sie sich mit den einfachen Grundlagen zu C++ vertraut und lernen Sie anhand zahlreicher Übungs- und Codebeispiele die Klassenkonzepte, Prozeduren und Funktionen kennen.

9 Std. 3 min (143 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Video-Training auf DVD mit Bonusmagazin

+ Tutorial to go: Mit Videos für iPod, iPhone & Co.

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!