Speicherverwaltung
-
hm...ok
Aber:
Warum hab ich dann kein Problem in ein Array, dass mit 5 Elementen allokiert ist, 10 Elemente zu schreiben?
Also, ich rede z.B. von einem EigeneKlasseArray[5];
-
Original erstellt von tobis79211:
hm...ok
Aber:
Warum hab ich dann kein Problem in ein Array, dass mit 5 Elementen allokiert ist, 10 Elemente zu schreiben?
Also, ich rede z.B. von einem EigeneKlasseArray[5];weil der speicher da ist.
int main() { int arr[5]; int x=4711; cout<<arr[6]<<endl; }
mit ein wenig glück gibt das programm 4711 aus.
int main() { int arr[5]; for(int i=0;i<6;++i)/eins zu weit arr[i]=0;//ups, bei arr[6]=0 passiert in wirklichkeit //i=0 //hübsche endlosschleife gebastelt. }
-
verwalten und Array out of bounds sind doch erstmal zwei fragen
verwalten tut c++ arrays nicht anders als ander variablen
lokale arrays werden so wie ander variablen am ende des scopes gelöscht
dynamische arrays müssen mit new[] allociert werden und mit delete[] deallociertzu "Array out of bounds" da wird nix zu gesagt, meistens kriegs du dann ne fehler meldung, ist aber nicht sicher
wenn du std::vector von stlport benutzt dann kriegst du aufjeden fall eine meldung[ Dieser Beitrag wurde am 13.05.2003 um 20:28 Uhr von Dimah editiert. ]
-
ok, danke!
Also wird dann einfach im Speicher auf das nächste gezeigt, auch wenn das schwachsinn ist?
Wie allokiere ich denn Speicher in C++?
Auch einfach mir realloc ?? (doof gefragt...)
-
Original erstellt von tobis79211:
Also wird dann einfach im Speicher auf das nächste gezeigt, auch wenn das schwachsinn ist?jep
Wie allokiere ich denn Speicher in C++?
new, new[] sowie delete,delete[] zum freigeben
siehe dein lieblings c++ buch
-
mit new und delete bzw. bei arrays new[] und delete[] http://www.fun-soft.de/Download/EBook/cplusplus/kap08.html#70357
-
Original erstellt von tobis79211:
**Wie allokiere ich denn Speicher in C++?
**zum beispiel mit int arr[5];
was willste genau? ein array, das die größe ändern kann? wenn eins ausreicht, das automatisch nach bedarf wachsen kann, dann wäre std::vector geeignet.vector<int> v; for(int i=0;i<5;++i) v.push_back(i*i);//v wächst jeweils um eins for(int i=0;i<5;++i) cout<<v[i]<<endl; //gibt 5 quadtratzahlen aus.
-
ok, aber was mach ich, wenn ich ein Array "feld" mit 5 Schlüsseln habe und es erweitern muss auf 10?
feld = new int[5]; feld2 = new int[10]; for(int i=0;i<5;i++) feld2[i] = feld[i]; delete feld; feld = new int[10]; feld = feld2; delete feld2;
????
Kann das sein, oder geht das nicht schlauer??
-
jedes new[] verlangt ein delete[]
lies mal in deinem C++ Buch nach.und dann nimm einen vector:
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);jetzt erweitern wir:
vec.push_back(3);
vec.push_back(3);
vec.push_back(3);und schon haben wir 8 elemente
-
Original erstellt von tobis79211:
**ok, aber was mach ich, wenn ich ein Array "feld" mit 5 Schlüsseln habe und es erweitern muss auf 10?feld = new int[5]; feld2 = new int[10]; for(int i=0;i<5;i++) feld2[i] = feld[i]; delete feld; feld = new int[10]; feld = feld2; delete feld2;
????
Kann das sein, oder geht das nicht schlauer??**fast perfekt.
feld = new int[5]; //feld irgendwie vollmachen //und erweitern mit feld2 = new int[10]; for(int i=0;i<5;i++) feld2[i] = feld[i]; delete[] feld; feld = feld2; //und zum schluß am besten noch löschen delete[] feld;
oder vector nehmen, das nimmt die viel ab.
vecor<int> feld(5); //feld irgendwie vollmachen //und erweitern mit feld.resize(10);//macht auch nur deinen code von oben innerhalb von resize //und zum schluß am besten noch löschen //macht der destruktor von vector dann alleine
-
ok, die beiden Lösungen reichen mir auf jeden Fall!
Dann vielen Dank Euch!
Gruss, TobiasPS: Dabei find ich C schon "netter"! (-> realloc)
-
Hi HALT!!!
Das klappt bei mir aber überhaupt nicht!Bei mir sieht der Code so aus:
Wobei Str eine Klasse von mir ist...// muss mehr allokiert werden if( (this->n+1)%ALLOC==0 ) { // mehr allokieren int i; Str* nw = new Str[this->n+ALLOC]; for(i=0;i<this->n;i++) nw[i] = Str[i]; delete[] this->Str; this->Str = new Str[this->n+ALLOC]; //for(i=0;i<this->n;i++) this->Str[i] = nw[i]; this->Str = nw; delete[] nw; } // DATEN EINFÜGEN Tue was...
Zum Test hab ich ALLOC mal auf 1 gestellt... allerdings bekomme ich dann beim einfügen eines zweiten Elementes einen Speicherfehler...
Also scheint das wohl nicht immer ordentlich erweitert zu werden!
Hilfe???[ Dieser Beitrag wurde am 14.05.2003 um 23:02 Uhr von tobis79211 editiert. ]
-
hi, bitte helft mir damit!
Ich bekomm echt dauernd noch Speicher-Errors, sobald ich die "alte" Feld-Grösse überschreite!
Danke!! Tobias
-
warum machst dus nicht so wie wirs vorgeschlagen haben?? (also mit container)
erklär mir mal folgende zeilen:
this->Str = nw;
delete[] nw;
und
if( (this->n+1)%ALLOC==0 )schau dir mal volkards code an, und vergleich ihn mit deinem...
-
Hi Shadow,
ja, ok, das sieht nicht so glücklich aus, war ein Test der nicht ging...
Folgendes ging nämlich auch nicht:if( (this->n)%ALLOC==0 ) { // mehr allokieren int i; Str* nw = new Str[this->n+ALLOC]; for(i=0;i<this->n;i++) nw[i] = Str[i]; delete[] this->Str; this->Str = new Str[this->n+ALLOC]; for(i=0;i<this->n;i++) this->Str[i] = nw[i]; //this->Str = nw; delete[] nw; }
Hierbei ist der einzige Unterscheid (glaub ich!) zu Volkard's Code, dass ich
for(i=0;i<this->n;i++) this->Str[i] = nw[i];
statt
feld = feld2;
mache.
Aber das müsste doch trotzdem klappen, oder? (Tut's halt nicht...)Ja, warum ich es so machen will, ist vermutlich reine Dickköpfigkeit... es muss ja so gehen, oder? (Dann will ich es halt auch hinbekommen!)
Wäre aber trotzdem sehr nett, wenn Du/Ihr mir hilfst!
Gruss, Tobias[ Dieser Beitrag wurde am 14.05.2003 um 23:01 Uhr von tobis79211 editiert. ]
[ Dieser Beitrag wurde am 14.05.2003 um 23:15 Uhr von tobis79211 editiert. ]
-
erklär mir bitte
if( (this->n)%ALLOC==0 )
ich verstehe diese zeile nicht.und dann erkläre mir bitte was hier passiert:
char* s=new char[100];
strcpy(s,"Hallo");
char* p=s;
delete [] s;
cout<<p;Was wird ausgegeben?
Was passiert bei der Zeile char* p=s
p Zeigt worauf?for(i=0;i<this->n;i++) this->Str[i] = nw[i];
die größe ist aber nicht n sondern n+ALLOC
-
wieso verwendest du übrigens so oft den this zeiger? befindest du dich in einer funktionsimplementierung einer klasse, kannst du ohne den this zeiger zugreifen, einfach so...
des weiteren: hast du eine Klasse namens 'Str' und ein objekt, das 'Str' heist? wäre grob fahrlässig, und der compiler müsste eigentlich meckern
-
Hi Shadow,
naja also das if() ist ein Test dafür, ob die Grösse des Arrays über eine gewisse Grenze wächst.
Als Beispiel: Wenn ALLOC 50 ist, dann wird alle 50 Schritte Speicher für weitere 50 allokiert!
...Dadurch kann man halt den Speicherverbrauch "regeln"Das Dein Beispiel nicht funktioniert ist mir völlig klar, schliesslich zeigt der Pointer p ja auf s!
Aber ich mach das doch garnicht (denke ich!), da ich neuen Speicher mit new allokiere und dann die Elemente einzeln da reinschiebe...
Zumindest dachte ich das so!
Oder hab ich da eine Lücke und ich schiebe da auch wieder nur Referenzen (Pointer) rum?Wenn das so wäre, dann wüsste ich immerhin wo der Fehler ist!
Gruss, Tobias
-
Hi,
also ich hab mir das echt zu Gewissen geführt...
Und in meinem Array Str* sind vom DatenTyp Str ja Daten gespeichert und keine Pointer! Das bedeutet, ich müsse die ja einfach aus ein Feld in ein anderes kopieren können, wenn ich dieses neue Feld allokiert habe, oder nicht?Als Beispiel:
Dein Beispiel mit den char* funktioniert doch auch, wenn du p und s mit malloc allokierst und dann mit ner for-Schleife vollschreibst.
Zumindest hab ich keinen Grund dafür, dass das nicht geht!
Das hat zumindest bei mir einwandfrei funktioniert:char* s=new char[100]; strcpy(s,"Hallo"); char* p = (char*) malloc( strlen(s)+1 ); for(int i=0;i<(int)strlen(s);i++) p[i] = s[i]; p[strlen(s)]='\0'; delete [] s; MessageBox(p,p,MB_OK);
Aber ist das nicht rein prinzipiell das gleiche, was ich auch mache???
Vielen Dank auch für weitere Hilfe gleich im voraus (und bitte nicht die Geduld verlieren!)
Gruss, Tobias
-
nimm dohc endlcih nen vector!