Dynamische Speicherzuweisung???
-
Mir ist in meinem Buch gerade aufgefallen das dort überhaupt nicht steht welchen Sinn eine dynamische Speicherzuweisung macht. Wäre Dankbar für beispiele und möglichst in reinem C.
-
Living Dead schrieb:
Wäre Dankbar für beispiele und möglichst in reinem C.
Ich glaube du hast dich im Forum geirrt. Frag mal die Leute im C-Forum
-
Ich habe den Sinn auch noch nicht ganz raus, aber ich denke, es macht erst bei größeren Objekten, sprich klassen sinn.
Stell dir vor du erstellst ein Bildverarbeitungsprogramm wie Photoshop, wo man mehrere Bilder aufeinmal laden kann. Du könntest jetzt auf verdacht ein Array vom Typ Bild erstellen (z.B. Bild[100]). Bei einer Auflösung 1280x1024 hast du bei einem Bild glaube schon 3MB die im Arbeitsspeicher belegt werden. Wenn du jetzt ein festes Array hast, werden also bei einem Array von 10 Objekten über 300MB (!) arbeitsspeicher verbraten, ohne das sie verwendet werden. Mit der Dynamischen Speicherverwaltung kannst du das ganze eben Speicherfreundlicher machen (Also nach und nach 3MB bei bedarf belegen). Außerdem kannst du den Speicher wieder freigeben, was bei festen nicht-dynamischen variablen auch ned geht, außer du verlässt die Funktion, wo sie definiert wurden.
Bei "Normalen" datentypen wie int oder char macht es natürlich keinen sinn, sie extra dynamisch zu reservieren, außer in ganz seltenen ausnahme fällen, würde ich mal sagen.
-
Der Sinn besteht darin, dass wenn du z.B. ein Array erstellen willst, aber nicht weiß wie groß es sein soll, naja bzw. wenn die Größe erst im Laufe des Programms durch z.B. eine User-Eingabe bestimmt werden soll.
Beispiel:nicht: int array[6] // du hast genau 6 Elemente sondern: int eingabe; cin >> eingabe; int array[eingabe];Dadurch wird das Array auf dem Heap angelegt.
2. Sinn
Wenn du eine Variable in einer Schleife deklarierst, dann ist diese Variable nach dem Verlassen der Schleife nicht mehr sichtbar, da sie in der Schleife lokal ist. Erstellst du sie aber auf dem Heap, also mit "new", dann ist sie auch weiterhin sichtbar.
-
milo51 schrieb:
2. Sinn
Wenn du eine Variable in einer Schleife deklarierst, dann ist diese Variable nach dem Verlassen der Schleife nicht mehr sichtbar, da sie in der Schleife lokal ist. Erstellst du sie aber auf dem Heap, also mit "new", dann ist sie auch weiterhin sichtbar.Das ist nicht ganz richtig. Die pointervariable ist dann auch nicht mehr sichtbar, das objekt ist aber noch da -> memory leak.
Kurt
-
Stimmt...aber irgendwo gab s doch noch eine Sache, womit man die lokalen Variablen umgehen konnt, mit Hilfe von new...was war das noch?^^
Oder irre ich mich da? Ich weiß, dass es noch einen Sinn von dynamischer Speicherzuweisung gab
-
Du könntest vor der Schleife einen Pointer erstellen, der die Adresse der variable bekommt, die in der Schleife erstellt worden ist.

beispiel:
#define MAX_USERS 32 //Zum Beispiel CUserData *Zahl; //Pointer auf CUserData for(int i=0;i<MAX_USERS;i++) { Zahl = new CUserData[MAX_USERS]; ... }
-
So wars

-
ich benutze malloc und free. Habe aber gehört das new und delete besser sein sollen und fast das gleiche machen. wie funktionieren new und delete und an was muss ich mich umgewöhenen?
mfg.
-
Eigentlich hab ich da Bullshit gemacht. ^^
Würde die schleife wirklich 32 mal durchlaufen, würde 31mal ein CUserData objekt erstellt werden. 30 davon liegen unzugreifbar im Speicher rum, während nur die 31. wieder freigebbar ist.Keine Ahnung, aber irgendwie so ging das wohl. ^^ Muss man wohl mit nem if oder so machen:
#define MAX_USERS 32 //Zum Beispiel CUserData *Zahl; //Pointer auf CUserData for(int i=0;i<MAX_USERS;i++) { if(i=MAX_USERS) Zahl = new CUserData[MAX_USERS]; else ... }
-
Ich glaube malloc und free benutzt man bei arrays? Aber ehrlich gesagt kenn ich den Unterschied auch nicht.
Ist bestimmt sowas wie class und struct, vom Prinzip das Selbe nur kleine aber feine Unterschiede.
-
Perner schrieb:
#define MAX_USERS 32 //Zum Beispiel CUserData *Zahl; //Pointer auf CUserData for(int i=0;i<MAX_USERS;i++) { Zahl = new CUserData[MAX_USERS]; ... }Auch nicht gerade ein gutes Beispiel. Du hast nach der Schleife zwar noch einen gültigen pointer auf ein array von CUserData. Trotzdem sind dir ein paar abhanden gekommen ( wenn MAX_USERS > 1 ). Wenn du das array aber innerhalb der Schleife wieder freigibst machts wiederun keinen Sinn Zahl schon ausserhalb der Schleife zu deklarieren, da Zahl nach der Schleife nicht mehr gültig ist.

Kurt
EDIT: Zu Spät bist schon selber draufgekommen
-
Nabend,
Perner schrieb:
Ich glaube malloc und free benutzt man bei arrays? Aber ehrlich gesagt kenn ich den Unterschied auch nicht.
Ist bestimmt sowas wie class und struct, vom Prinzip das Selbe nur kleine aber feine Unterschiede.in C++ nutzt man 'new' und 'delete' bzw. fuer Arrays 'new type[limit]' und
'delete[]'. Der Unterschied ist, dass 'new' den CTor des Objektes aufruft und
'delete' den DTor. Das geschiet bei 'malloc' und 'free' nicht.Man sollte auch darauf achten, 'malloc', 'new', 'free' und 'delete' nicht zu
mischen. Entweder benutzt man das eine oder das andere. Und wenn man mit Objekten
arbeitet, kommt man um 'new' etc. nicht herum, den Grund dafuer habe ich
bereits geschrieben.mfg
v R
-
virtuell Realisticer schrieb:
Man sollte auch darauf achten, 'malloc', 'new', 'free' und 'delete' nicht zu
mischen.Wieso? Man kann ja new und delete für klassen nehmen und malloc und free für arrays. Oder nicht?
mfg.
-
"Mischen" meinte sinngemäß dass Du kein Objekt mit new anlegen und mit free() freigeben sollst (oder vice versa)
-
LordJaxom schrieb:
"Mischen" meinte sinngemäß dass Du kein Objekt mit new anlegen und mit free() freigeben sollst (oder vice versa)
Achso. Okay, alles klar.
mfg.
-
joomoo schrieb:
virtuell Realisticer schrieb:
Man sollte auch darauf achten, 'malloc', 'new', 'free' und 'delete' nicht zu
mischen.Wieso? Man kann ja new und delete für klassen nehmen und malloc und free für arrays. Oder nicht?
mfg.
Abgesehen davon, dass du meinst man solle new/delete für Klassen/Strukturen verwenden, und malloc/free für built-ins nehmen, kann man mit new[] auch dyn. Arrays anlegen und mit delete[] wieder freigeben.
Aber warum sollte ich in C++ noch malloc nehmen?