Anlegen und Freigeben v0n Speicher



  • 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.htm

    Da 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 sichern
    

    Wo 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. Danke

    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:

    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.


Anmelden zum Antworten