Wohl Ärger mit Zeigern.....
-
Hi zusammen,
ich hab nen Zeigerproblem mit der folgenden Klasse, es wird, wenn ich eine Zuweisung mache:IntArray temp = getDomainAt(b,i); int* myArr; myArr = temp.getArray(); [cpp] ab und zu mal eine 5 in beiden arrays, myArr und temp.arr zu 27. Hat jemand ne Idee warum? [cpp] class IntArray { public: int* arr; int size; IntArray() { arr = NULL; size = 0; } ~IntArray(){ //std::cout << "IntArray Destruktor\n"; //if (arr!= NULL) delete[] arr; //std::cout << "Intarray DEstruktor Ende\n"; } IntArray(const IntArray& p){ size=p.size; arr = new int[size]; for (int i=0; i<size; i++) arr[i] = p.arr[i]; } IntArray const& operator=(IntArray const& p) { size=p.size; arr = new int[size]; for (int i=0; i<size; i++) arr[i] = p.arr[i]; return *this; } int* getArray() { if (arr == NULL) return NULL; int* ret = new int[size]; for (int i=0; i<size; i++){ cout << arr[i]; ret[i]=arr[i]; cout << ret[i] <<" ?=" << arr[i] << endl; } return ret; } };
-
Hi,
würde Dir gerne helfen, aber ich versthe den Satz nicht:
EvilEpsilon schrieb:
...
ab und zu mal eine 5 in beiden arrays, myArr und temp.arr zu 27....Gruß,
Simon2.
-
Simon2 schrieb:
Hi,
würde Dir gerne helfen, aber ich versthe den Satz nicht:
EvilEpsilon schrieb:
...
ab und zu mal eine 5 in beiden arrays, myArr und temp.arr zu 27....Ich glaube er meint, dass er in beiden Arrays (myArr und tmp.arr) jeweils ne 5 stehen hat, die dann in beiden Arrays zu ner 27 werden. Warum auch immer.
-
Aha. Kann sein.
Um das analysieren zu können, müssten wir wohl "ein wenig mehr main sehen".
Ich finde allerdings die "IntArray"-Klasse ein wenig seltsam: Woher bekommt das Objekt denn seinen Speicher ?Im StandardCtor wird er auf "nix" gesetzt, im CpyCtor erzeugt er sich selbst welchen. D.h. aber, dass ein Objekt, dass "per Copy erzeugt" wurde, ein delete[] durchführen muß, während ein "per Standard konstruiertes" das (vermutlich) nicht darf.
Wahrscheinlich kommt daher auch Deine "DTor-Verwirrung" ...
Außerdem wird beim operator=() dann noch Speicher geholt, ohne dass der vorher benutzte freigegeben wird (hat vermutlich dieselbe Ursache: Man weiß ja nicht, ob das Objekt so oder so erzeugt wurde).
Letztlich sollte die Klasse den Speicher komplett kapseln (non-public-Attribute und keine "Speicherersetzung von Außen" möglich).Ich denke, EvilEpsilon erzeugt mehrere IntArrays, die auf denselben Speicher verweisen und manipuliert den dann (evtl. ungewollt) von Außen auch noch.
NACHTRAG: Falls Du das nicht nur zum Lernen verwenden möchtest, sondern tatsächlich irgendwo "brauchst", wäre std::vector<int> bestimmt die bessere Wahl...
Gruß,
Simon2.