| View previous topic :: View next topic |
| Author |
Message |
py-ro Veteran


Joined: 24 Sep 2002 Posts: 1123 Location: St. Wendel
|
Posted: Thu Nov 04, 2004 3:17 pm Post subject: [OT] Zeiger in C++ |
|
|
Hallo,
ich habe mal wieder ein Problem.
Ich bin in C++ etwas eingerostet,
will aber mal wieder ein Programm schreiben,
gesagt getan.
Folgendes Problem:
Ich habe ein Klasse(A) in der ein Zeiger auf einen Vector(V1) mit Elementen einer anderen Klasse(B) zeigt.
Diesen Vector erzeuge ich im Konstruktor der Klasse A.
Wenn ich nun aber in einer Methode der Klasse A Ein Element an V1 des Typs B anhängen möchte,
bekomme ich einen Segmentation Fault.
Was wohl daran liegt das der Zeiger nicht mehr auf V1 zeigt.
Nur warum Zeigt der Zeiger nicht mehr auf V1?
Also habe ich eine Klasse Test geschrieben in der ich oben genanntes ausschliesslich ausprobiert habe
und siehe da kein Problem, sollte also gehen.
Jemand eine Idee?
MfG
Py
Den Quelltext der Klassen wollte ich jetzt nicht schicken... sind bereits ein paar Hundert... |
|
| Back to top |
|
 |
reptile Guru

Joined: 19 Nov 2002 Posts: 363
|
Posted: Thu Nov 04, 2004 4:37 pm Post subject: |
|
|
versuch mal, dem vektor eine gewisse startgrösse zu geben, zum beispiel:
| Code: |
vector< Type > Type_Vec(15);
|
bzw.
| Code: |
vector< Type > *Type_Vec_Ptr = new vector< Type >(15);
|
(wobei ich mir beim zweiten beispiel nicht sicher bin, dass es syntaktisch so richtig ist.)
ich hab auch probleme mit segfaults bei vektoren, und daher bei absehbaren grössen von vektoren arrays genommen - ich vermute mal, dass da ein fehler in der implementierung von alloc bei gcc zumindest bis 3.3 vorliegt. es klappt für mich nichtmal bei strings.
alternativ kannst du mit
| Code: |
Type_Vec_Ptr->reserve(Type_Vec_Ptr->capacity() + 5);
|
auch die kapazität nach dem anhängen eines elements um 5 erhöhen (oder wie viele du auch eben brauchst). |
|
| Back to top |
|
 |
abcd n00b

Joined: 27 Oct 2004 Posts: 32
|
Posted: Thu Nov 04, 2004 5:07 pm Post subject: |
|
|
Es kann viele Gruende dafuer geben,
- es kann sein, dass du deinen Zeiger im Laufe des Programms verbiegst
- oder, falls du den Speicher dynamisch reservierst, irgendwo zufaellig freigibst (d.h "irgendwas = new irgendwas[10]", und dann irgendwo "delete []irgendwas") und dann mit diesem freigegebenen Speicher weiter arbeitest
- oder, da du den V1 (ich nehme an, als lokale Variable) im Konstruktor anlegst und den Zeiger innerhalb des Konstruktors darauf setzt, versuchst, ausserhalb des Konstruktors darauf zuzugreifen. Alle lokalen Variablen werden auf dem Stackspeicher abgelegt. Wird die Funktion (in diesem Fall der Konstruktor) verlassen, wird auch der entsprechende Stackbereich freigegeben, aber dein Zeiger zeigt immer noch auf diesen freigegebenen Bereich. Das Programm kann normal weiterlaufen, so lange du dort den Speicherinhalt nicht veraenderst...  |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|