new und delete überladen



  • Hallo,

    bin mit meinem Programm nun eine gutes Stück weiter gekommen, habe aber jetzt folgendes Problem.

    Klasse A:

    class A{
      public:
        ...
      private:
        int i;
    };
    

    Diese Klasse A soll über new erzeugt werden und muß dann ja mit delete wieder gelöscht werden.
    In einem Vektor habe ich die Adressen gespeichert:

    vector <*A> vecA;
    A* tmpA;
    for (int j = 0; j<10; j++){
      tmpA = new A;
      vecA.pushBack(tmpA);
    }
    

    jetzt möchte ich ein beliebiges Element löschen:

    delete vecA.at(5);
    vecA.at(5) = NULL;
    

    Das funktioniert aber nicht und führt zum Absturz...(bei delete)
    Wie müssen denn die Operatoren new und delete gemacht werden?? ich vermute es liegt daran.

    mfg micha



  • Hi,

    der Code ist so natürlich nicht komplilierbar, aber das wirst du wohl wissen. Du musst natürlich nicht new/delete überladen um dein Problem zu lösen. Ich vermute mal, es stürzt aufgrund der letzten Zeile ab:

    vecA.at(5) = NULL;
    


  • Hallo,

    ja, das ist nur der Teil in dem ich das Problem vermute.
    Auch ohne die NULL-Zeile geht es nicht.

    Wenn ich sie weglasse steckt hinter dem Zeiger doch eine Adresse wo kein Objekt vom Typ A mehr liegen muß. Das ist kritisch. Soviel ich weiß darf man einen Nullzeiger so setzen, oder nicht (wenn ich "0" statt NULL setze kommt auch der Fehler)?

    Das Problem scheint im delete zu liegen. Wenn ich direkt vor delete und hinter ein cin.get() setze, dann hält das Programm an und meldet erst nach der Enter-Eingabe einen Fehler. Zum zweiten cin.get() kommt es nicht.

    delete ruft doch den Destruktor auf. Hier lasse ich mir mittels cout << "Destr"; ausgeben, wann dieser Pkt erreicht ist, aber auch dazu kommt es schon nicht...

    Es muß also was mit der delete-zeile zu tun haben.....

    mfg Micha



  • hola micha_1

    hab mal deinen code getestet:

    TxlString *temp;
       vector<TxlString*> array;
       for(int i = 0;i < 10;i++)
       {
          temp = new TxlString;
          array.push_back(temp);
       }
    
       delete array.at(5);
       array.at(5) = 0;
    
       for(int i = 0;i < 10;i++)
       {
          if(array.at(i))
          delete array.at(i);
          array.at(i) = 0;
       }
    

    bei mir gab es da ueberhaupt kein problem.

    @CarstenJ
    was meinst du mit

    der Code ist so natürlich nicht komplilierbar, aber das wirst du wohl wissen.

    Meep Meep



  • Hi,
    Mal abgesehen davon das man keine RawPointer in Containern benutzen soll weiß ich nicht was das problem ist.

    Das funktioniert doch einwandfrei:

    #include <vector>
    #include <iostream>
    using namespace std;
    
    class A{
    int val;
    public:
    explicit A(int v):val(v){cerr << "A constructed with val = " << v << endl; }
    ~A(){ cerr << "A destructed with val = " << val << endl;}
    };
    
    int main(){
    
    vector <A*> vecA;
    for (int j = 0; j<10; j++){
    	vecA.push_back(new A(j));
    }
    
    delete vecA.at(5);
    vecA.at(5) = NULL;
    
    std::vector<A*>::iterator start = vecA.begin(), end = vecA.end();
    while(start != end) 
    	delete ((A*)*start++);
    cout << "Finished..." << endl;
    }
    

    Output schrieb:

    A constructed with val = 0
    A constructed with val = 1
    A constructed with val = 2
    A constructed with val = 3
    A constructed with val = 4
    A constructed with val = 5
    A constructed with val = 6
    A constructed with val = 7
    A constructed with val = 8
    A constructed with val = 9
    A destructed with val = 5
    A destructed with val = 0
    A destructed with val = 1
    A destructed with val = 2
    A destructed with val = 3
    A destructed with val = 4
    A destructed with val = 6
    A destructed with val = 7
    A destructed with val = 8
    A destructed with val = 9
    Finished...



  • Meep Meep schrieb:

    @CarstenJ
    was meinst du mit

    der Code ist so natürlich nicht komplilierbar, aber das wirst du wohl wissen.

    Da waren einige Fehler drin. das stimmt schon.
    MfG



  • Hi,

    ich sehe auch keinen Fehler, mein erster Tipp war nur ne Vermutung. Der Fehler muss dann wohl woanders liegen. Kannst du evtl. mehr Code posten?



  • Hi,

    das Problem hat sich erledigt. Nach längerem Suchen ist mir der tatsächliche Fehler aufgefallen. Ich habe, kurz gesagt, ein Objekt 2x gelöscht. Das mußte crashen.

    mfg Micha



  • eViLiSSiMo schrieb:

    Mal abgesehen davon das man keine RawPointer in Containern benutzen soll ...

    Gibt's dazu ne Begründung?


Anmelden zum Antworten