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.


Anmelden zum Antworten