Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Variable zur laufzeit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ] [ 6 ] [ 7 ]
030
10.08.2003, 11:48 Uhr
~Anfänger00
Gast


Das ist mir schon klar,nur ich versteh nicht ganz die logik des Löschvorgangs
ich würde halt

C++:
for(int i;i<y;i++)
{
for(int j;j<x;j++)
{
delete my_2d_array[i][j];
}


schreiben,was allerdings mit einer Fehlermeldung verbunden ist..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
10.08.2003, 11:50 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Olli
lustiger Avatar, kommt besser als die Krake

@Anfänger00

C++:
delete[] my_2d_array[ i ];


du musst das einzeln freigeben weil du das auch einzelen allokiert hast.
du kannst quasi keine Mehrdimensionalen felder allokieren.

du hast die wie oben schon mal beschrieben das 2_d feld zusammengebaut, in dem du als erstes ein feld von pointer allokiert hast.

Jeder pointer in diesem feld wiederum bekommt ein "eigenes" array zugewiesen bzw allokiert.

diesen speicher den jeder einzelner pointer in dem array bekommt musst du wieder freigeben bevor du den speicher des pointers auf das pointer_Array freigibst, da dieser sonst im RAM steht ohne das du ne chance hast da jemals wieder ranzukommen, da die die pointer die auf diese speicher zeigen ja mit

delete[] my_2d_array; gelöscht hast


Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
10.08.2003, 11:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ups du hattest schon wieder gepostet

das auf keinen fall machen

C++:
for(int i;i<y;i++){
  for(int j;j<x;j++){
   delete my_2d_array[ i ][j];
  }
}



du musst den speicher schon wieder genau umgekehrt freigeben wie du ihn allkiert hast.

mal als anmerkung


C++:
delete [] pointer;  //löscht das 1d_Array auf das der pointer zeigt
delete pointer;   //löscht nur den speicher an der stelle auf die der pointer zeigt


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
10.08.2003, 12:22 Uhr
~Anfänger
Gast


Also mit delete[] my_2d_array; gibt man nicht den speicher frei sondern man löscht nur die pointer die auf den speicher zeigen und kann den speicher nicht freigeben da nur die pointer die jetzt gelöscht sind wüssten wo die Daten auf dem Speicher liegen.Also kommt man nicht mehr ran. ok
aber:

C++:
for(int i=0;i<y;i++)
{
my_2d_array[i] = new int [x];
for(int j=0;j<x;j++)
{      
         my_2d_array[i][j]= rand();
     cout<<my_2d_array[i][j]<<"\t";
     delete[] my_2d_array[i];
/* wenn ich jetzt hier lösche dürfte doch beim nächsten
     Schleifendurchlauf(der x schleife) das array[1][2] garnichtmehr existieren,
     nach meiner Auffassung müsten jetzt alle array[1][1],a[1][2],
     a[1][3]...a[1][x] gelöscht sein,was aber nicht aufeinmal,(wie
     von mir erwartet)sondern bei jeder delete Anweisung passiert,
     also müsste das Programm die elemente nacheinander von alleine         löschen. da zu müsste die delete Anweisung wissen wie groß x ist /*
}
}



Also ich hoffe ich hab euch jetzt nicht zu sehr verwirrtt
Aber ich hoffe ihr wisst jetzt was ich nicht verstehe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
10.08.2003, 12:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Also mit delete[] my_2d_array; gibt man nicht den speicher frei sondern man löscht nur die pointer die auf den speicher zeigen und kann den speicher nicht freigeben da nur die pointer die jetzt gelöscht sind wüssten wo die Daten auf dem Speicher liegen.Also kommt man nicht mehr ran. ok



Neeeeeeeeiiiiiiiiiiiiin

du gibst damit den speicher des Arrays frei auf das der pointer my_2d_array zeigt;
(in unserem fall war das ein array das aus pointer besteht)

Jetzt klar?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.08.2003 um 12:40 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
035
10.08.2003, 12:50 Uhr
~Anfänger00
Gast


Also delete[] my_2d_array gibt my_2d_array[y] frei,also das erste Feld des arrays
und delete my_2d_array gibt my_2d_array[1][x] frei,also das zweite Felde des Arrays

is das jetzt korrekt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
036
10.08.2003, 13:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also noch mal


C++:
my_2d_array = new int*[y];



dieser befehl allokiert dir ein array der grösse y (indices laufen von 0 bis y-1)wobei jedes element des arrays ein integerpointer (int*)ist.

zugriff auf die pointer dieses arrays hast du mit

C++:
my_2d_array[i];



für jeden integerpointer dieses Arrays legen wir wiederum ein array aus integerwerten an


C++:
for(i=0;i<y;i++)
my_2d_array[i]=new int[x];  //hier wird für den jeweiligen integerpointer ein array aus integerwerten allokiert mit der grösse x



wenn du den speicher jetzt wieder freigeben musst muss du erst die arrays die für jeden integerpointer allokiert wurden wieder freigebn


C++:
for(i=0;i<y;i++)
delete [] my_2d_array[i];  //das speicher der dem jeweilegen integerpointer zugewiesen wurde wird wieder freigeben.



zum schluss geben wir dann wieder den speicher für das array das aus intergerpointer besteht frei


C++:
delete [] my_2d_array;




wenn du es jetzt nicht verstanden hast leg ich mir die karten.

Vieleicht kann das ja sonst einer der Forumsgenies besser erklären

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.08.2003 um 13:13 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
037
10.08.2003, 13:20 Uhr
Oliver
S2-Pixelgeneral


Ich finde, dass man solche Sache soweiso nicht so schnell mal im Forum erklären kann, da helfen nur Bücher.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
038
10.08.2003, 13:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Olli
also ich hab mein komplette wissen durch probieren, der msdn und aus dem forum.
Bücher zum proggen hab ich nocht nicht ein einziges gelesen.

Muss also auch ohne die komsichen Büscher gehen. Lerning by doing gefällt mir was das proggen angeht besser


Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
039
10.08.2003, 13:28 Uhr
Oliver
S2-Pixelgeneral


Also C++ ohne , wer für mich der .

Die MSDN ist für mich mehr ein Nachschlagewerk, in einem Buch (zumindest in den meisten) wird alles der Reihe nach behandelt.

Aber ist Geschmacksache...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ] [ 6 ] [ 7 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: