Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Speicherverwaltung     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 20:08:00 13.05.2003   Titel:   Speicherverwaltung            Zitieren

Hi,
ich hab nur um kurz sicher zu gehen eine Frage:
Stimmt es, dass C++ Speicher von Arrays selbst verwaltet?
Also muss ich, oder muss ich nicht darauf achten, dass ich einen sog. "Array out of bounds"-Fehler bekomme?
Gruss, Tobias
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25731
Beitrag volkard Moderator 20:10:00 13.05.2003   Titel:              Zitieren

Zitat:
Original erstellt von tobis79211:
Hi,
ich hab nur um kurz sicher zu gehen eine Frage:
Stimmt es, dass C++ Speicher von Arrays selbst verwaltet?
Also muss ich, oder muss ich nicht darauf achten, dass ich einen sog. "Array out of bounds"-Fehler bekomme?
Gruss, Tobias


stimmt so nicht. normale arrays wie int a[100] funktionieren wie in c.
kanns aber dir selber klassen bauen, oder fremde kalssen verwenden, die speicher selber verwalten, grenzen überprüfen und was sonst noch brauchbar wäre.

_________________
ewr-dienstleister krankenversicherung
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 20:14:00 13.05.2003   Titel:              Zitieren

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];
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25731
Beitrag volkard Moderator 20:17:00 13.05.2003   Titel:              Zitieren

Zitat:
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.

C++:
int main()
{
  int arr[5];
  int x=4711;
  cout<<arr[6]<<endl;
}

mit ein wenig glück gibt das programm 4711 aus.

C++:
1
2
3
4
5
6
7
8
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.
}

_________________
ewr-dienstleister krankenversicherung
Gerard
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2002
Beiträge: 6118
Beitrag Gerard Mitglied 20:27:00 13.05.2003   Titel:              Zitieren

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[] deallociert

zu "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. ]
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 20:32:00 13.05.2003   Titel:              Zitieren

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...)
Gerard
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2002
Beiträge: 6118
Beitrag Gerard Mitglied 20:35:00 13.05.2003   Titel:              Zitieren

mit new und delete bzw. bei arrays new[] und delete[] http://www.fun-soft.de/Download/EBook/cplusplus/kap08.html#70357
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18954
Beitrag Shade Of Mine Moderator 20:35:00 13.05.2003   Titel:              Zitieren

Zitat:
Original erstellt von tobis79211:
Also wird dann einfach im Speicher auf das nächste gezeigt, auch wenn das schwachsinn ist?

jep
Zitat:
Wie allokiere ich denn Speicher in C++?

new, new[] sowie delete,delete[] zum freigeben
siehe dein lieblings c++ buch

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25731
Beitrag volkard Moderator 20:38:00 13.05.2003   Titel:              Zitieren

Zitat:
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.
C++:
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.

_________________
ewr-dienstleister krankenversicherung
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 20:42:00 13.05.2003   Titel:              Zitieren

ok, aber was mach ich, wenn ich ein Array "feld" mit 5 Schlüsseln habe und es erweitern muss auf 10?

C++:
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??
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18954
Beitrag Shade Of Mine Moderator 20:44:00 13.05.2003   Titel:              Zitieren

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 :)

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25731
Beitrag volkard Moderator 20:48:00 13.05.2003   Titel:              Zitieren

Zitat:
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?
C++:
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.
C++:
1
2
3
4
5
6
7
8
9
10
11
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.
C++:
1
2
3
4
5
6
7
8
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

_________________
ewr-dienstleister krankenversicherung
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 20:50:00 13.05.2003   Titel:              Zitieren

ok, die beiden Lösungen reichen mir auf jeden Fall!
Dann vielen Dank Euch!
Gruss, Tobias

PS: Dabei find ich C schon "netter"! (-> realloc)
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 17:59:00 14.05.2003   Titel:              Zitieren

Hi HALT!!!
Das klappt bei mir aber überhaupt nicht!

Bei mir sieht der Code so aus:
Wobei Str eine Klasse von mir ist...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
  // 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. ]
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 22:13:00 14.05.2003   Titel:              Zitieren

hi, bitte helft mir damit!
Ich bekomm echt dauernd noch Speicher-Errors, sobald ich die "alte" Feld-Grösse überschreite!
Danke!! Tobias
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18954
Beitrag Shade Of Mine Moderator 22:17:00 14.05.2003   Titel:              Zitieren

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

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 23:00:00 14.05.2003   Titel:              Zitieren

Hi Shadow,
ja, ok, das sieht nicht so glücklich aus, war ein Test der nicht ging...
Folgendes ging nämlich auch nicht:
C++:
1
2
3
4
5
6
7
8
9
10
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
C++:
for(i=0;i<this->n;i++) this->Str[i] = nw[i];

statt
C++:
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. ]
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18954
Beitrag Shade Of Mine Moderator 23:44:00 14.05.2003   Titel:              Zitieren

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

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Korbinian
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.02.2002
Beiträge: 3105
Beitrag Korbinian Mitglied 23:54:00 14.05.2003   Titel:              Zitieren

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 ;)

_________________
Frage an mich? korbinian at c-plusplus dot de
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 18:39:00 15.05.2003   Titel:              Zitieren

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
tobis79211
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.03.2002
Beiträge: 395
Beitrag tobis79211 Mitglied 22:34:00 15.05.2003   Titel:              Zitieren

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:
C++:
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
dEUs
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2001
Beiträge: 11762
Beitrag dEUs Mitglied 07:44:00 16.05.2003   Titel:              Zitieren

nimm dohc endlcih nen vector!

_________________
Gruß,
dEUs
c++.de :: C++ (auch C++0x und C++11) ::  Speicherverwaltung   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.