Anlegen und Freigeben v0n Speicher
-
Mach dich mal schlau, was der Unterschied zwischen Stack und Heap ist...
Hier gibt's was zu lesen:
http://magazin.c-plusplus.net/artikel/Speicherverwaltung in CPlusPlus (und C)
-
asdasd schrieb:
Also wenn ich während meines Programmes ein Speicher brauche
EINEN Speicher!
Ansonsten: Werd erwachsen.
-
_matze schrieb:
Mach dich mal schlau, was der Unterschied zwischen Stack und Heap ist...
Hier gibt's was zu lesen:
http://magazin.c-plusplus.net/artikel/Speicherverwaltung in CPlusPlus (und C)ja der unterschied ist mir schon klar.
also im stack werden sie halt "gestapelt" gespeichert nachm last-in und firstout prinzip
und im heap werden sie quasi in einem "haufen" gepsichert, wo nach bedingungen etc. gearbeitet wird.aber wann brauch ich das?
also ich würde weiterhin mit den ganz "normalen" variabeln weiterarbeiten.sprich sobald ich irgendwas speichern will, knall ich das einfach in string oder variabel.
-
asdasd schrieb:
aber wann brauch ich das?
also ich würde weiterhin mit den ganz "normalen" variabeln weiterarbeiten.sprich sobald ich irgendwas speichern will, knall ich das einfach in string oder variabel.
Versuch mal das:
int myIntArray[1024*1024][10];Oder das
int arrSize=10; int myIntArray[arrSize];
-
tztztz schrieb:
asdasd schrieb:
Also wenn ich während meines Programmes ein Speicher brauche
EINEN Speicher!
Ansonsten: Werd erwachsen.
Erwachsen.

Ansonsten: Entspann dich Papa.@Matze:
Nagut bei Arrays kann ich es nachvollziehen. Wenn man z.B. im Laufe des Programmes X (je nach Eingabe) Spieler für ein Game anlegen möchte.Aber ich habe trotzdem noch ne Frage.
Ich lese gerade das Tutorial http://www.willemer.de/informatik/cpp/dynamic.htmDa ist folgendes Beispiel aufgeführt: int *Lotto = 0; // Zeiger definieren und sichern Lotto = new int [6]; // Array mit sechs Elementen erzeugen for (i=0; i<6; i++) // Array durchlaufen { Lotto[i] = rand() % 49 + 1; // Lottozahl erzeugen } delete[] Lotto; // Freigabe des Speichers Lotto = 0; // Zeiger sichernWo kommt i her? Wurde das vergessen zu deklarieren?
Und woher weiß der Computer nun, dass Lotto eine Array sein soll?
Erkennt er es an der eckigen Klammer "new int [6]?Und in dem Beispiel nun:
Aber man hätte doch auch genau so gut gleich ne Array anlegen können:
int Lotto[6];Die 6 wurde ja sowieso manuell in der Schleife beim Prüfungsteil eingegeben (i<6;)
-
Also bei mir wurde keine Arraymit 5 Elementen angelegt.
Habs gerade mal debuggen lassen.
-
asdasd schrieb:
Erwachsen.

Ähm, nein! Das wird kleingeschrieben...
asdasd schrieb:
Nagut bei Arrays kann ich es nachvollziehen. Wenn man z.B. im Laufe des Programmes X (je nach Eingabe) Spieler für ein Game anlegen möchte.
Ja, zum Beispiel. Oder auch wenn du einen Speicherbereich brauchst, für den der Stack einfach zu klein ist (das sollte das andere Beispiel verdeutlichen).
asdasd schrieb:
Wo kommt i her? Wurde das vergessen zu deklarieren?
In dem von dir geposteten Code fehlt die Deklaration, ja.
asdasd schrieb:
Und woher weiß der Computer nun, dass Lotto eine Array sein soll?
Erkennt er es an der eckigen Klammer "new int [6]?Ja. Damit erzeugst du einen zusammenhängenden Speicherblock der Länge 6*sizeof(int).
asdasd schrieb:
Und in dem Beispiel nun:
Aber man hätte doch auch genau so gut gleich ne Array anlegen können:
int Lotto[6];Ja. Ist halt nur ein Beispiel.
-
asdasd schrieb:
Also bei mir wurde keine Arraymit 5 Elementen angelegt.
Nee, sondern mit 6 Elementen (0-5)...
asdasd schrieb:
Habs gerade mal debuggen lassen.
Ach ja, vom wem denn?

-
Hey,
danke für die schnelle Antwort.Also ich habe nun mal
int main() { int *Lotto = 0; Lotto = new int[6]; delete[] Lotto; getch(); }geschrieben.
Der Compiler meckert nicht.
Aber er legt auch keine Array mit 6 Elementen an.
Warum nicht? Was mache ich da falsch?
-
asdasd schrieb:
Aber er legt auch keine Array mit 6 Elementen an.
Warum nicht? Was mache ich da falsch?Woran siehst du das?
-
_matze schrieb:
asdasd schrieb:
Aber er legt auch keine Array mit 6 Elementen an.
Warum nicht? Was mache ich da falsch?Woran siehst du das?
Breakpoint gesetzt und halt mit dem Debugger nachgeschaut, was für Variabeln erstellt wurden.
Wenn ich im Code ganz normal
int Lotto2[6];hinzufüge, legt er für Lotto2 .. 6 Elemente an.
Aber das mit dem anderen klappt leider nicht.
-
Das liegt daran, dass du mit new halt kein Array deklariert hast, sondern einen Speicherbereich von 6 aufeinanderfolgenden int's reserviert und die Adresse des ersten Elements deinem int-Zeiger zugewiesen hast. Du kannst aber ganz normal mit operator[] darauf zugreifen.
EDIT: Störe dich nicht an den Unzulänglichkeiten des Debuggers.

Übrigens, falls du das Visual Studio benutzt: du kannst den int-Zeiger in das Überwachungsfenster ziehen (Drag&Drop, oder selbst eingeben) und dahinter ",6" eingeben. Dann werden dir dort alle 6 Elemente angezeigt.
-
_matze schrieb:
Das liegt daran, dass du mit new halt kein Array deklariert hast, sondern einen Speicherbereich von 6 aufeinanderfolgenden int's reserviert und die Adresse des ersten Elements deinem int-Zeiger zugewiesen hast. Du kannst aber ganz normal mit operator[] darauf zugreifen.
EDIT: Störe dich nicht an den Unzulänglichkeiten des Debuggers.

Übrigens, falls du das Visual Studio benutzt: du kannst den int-Zeiger in das Überwachungsfenster ziehen (Drag&Drop, oder selbst eingeben) und dahinter ",6" eingeben. Dann werden dir dort alle 6 Elemente angezeigt.
Also bei mir wird das hier angezeigt:
http://img196.imageshack.us/i/screenxp.jpg/
-
Ich sagte ja, du sollst "Lotto,6" eingeben...
-
Ich sehe in dem Screenshot nirgends ",6".
-
_matze schrieb:
Ich sagte ja, du sollst "Lotto,6" eingeben...
Habs erst mit Drag&Drop versucht.
Aber nun gehts. DankeAlso das man das für Arrays braucht, hab ich verstanden aber was mir immer noch nicht ganz klar ist:
z.B.
int *intZeiger = new int(2);Wann brauch ich sowas?
Also ich kann doch genau so gut
int abc = 2;
schreiben?!
Würde mich über ein Beispiel freuen, wo man auch ne "normale" Variabel mit new anlegen sollte
-
ASDasd schrieb:
Habs erst mit Drag&Drop versucht.
Auch bei der D&D-Variante habe ich gesagt, dass du ",6" dahintersetzen musst... :p
-
_matze schrieb:
ASDasd schrieb:
Habs erst mit Drag&Drop versucht.
Auch bei der D&D-Variante habe ich gesagt, dass du ",6" dahintersetzen musst... :p
Ja ok
Hast gewonnen 
Also das man das für Arrays braucht, hab ich verstanden aber was mir immer noch nicht ganz klar ist:
z.B.
int *intZeiger = new int(2);Wann brauch ich sowas?
Also ich kann doch genau so gut
int abc = 2;
schreiben?!
Würde mich über ein Beispiel freuen, wo man auch ne "normale" Variabel mit new anlegen sollte
-
asdasd schrieb:
Würde mich über ein Beispiel freuen, wo man auch ne "normale" Variabel mit new anlegen sollte
Normalerweise musst du das auch nicht. Mir fällt spontan der Fall ein, dass man ein sehr großes struct instanziieren will, das den Stack gefährlich füllen würde. Ich hatte mal so einen Fall. Ein struct von ca. 600-700KB Größe (war ein Riesen-LUT drin) ist beim Standard-Stack von 1MB nicht so toll.

-
_matze schrieb:
asdasd schrieb:
Würde mich über ein Beispiel freuen, wo man auch ne "normale" Variabel mit new anlegen sollte
Versuch mal, nur mit automatischen Variablen eine beliebige Anzahl beliebig langer Zeilen einzulesen. Beliebig heisst, dass Anzahl und Länge vorher nicht bekannt sind.