Ist hier nen Speicherleck?



  • class GBase
    {
     public:
      GBase(int bx,int by){x=bx,y=by;}
      virtual void Align(GBase *gobject)
      {
       if(typeid(*this)!=typeid(*gobject))
       {
        cout<<"Fehler beim Ausrichten "<<typeid(*this).name();
        cout<<" und "<<typeid(*gobject).name();
        cout<<" sind keine gleichen Objecte"<<endl;
        throw "Ungleiche Elemente";
       }
       else
       {
       gobject->x=x;
       gobject->y=y;
       }
      }
     protected:
     int x;
     int y;
    };
    class GBar:public GBase
    {
     public:
     GBar(int tx,int ty,int tt):GBase(tx,ty){t=tt;}
     private:
     int t;
    };
    
    class GCircle:public GBase
    {
     public:
     GCircle(int tx,int ty,int tr):GBase(tx,ty){r=tr;}
     private:
     int r;
    };
    
    int main(int argc, char* argv[])
    {
    GBase* object[3];
    object[0] = new GBar(1,2,3);
    object[1] = new GCircle(2,3,4);
    object[2] = new GBar(3,4,5);
    try
    {
     object[0]->Align(object[1]);
    }
    catch(const char* cg)
    {
     cout<<cg;
    }
     delete[] object;       //bin verwirrt, aber wird der speicher hier richtig freigegeben?
     getch();     return 0;
    }
    

    siehe kommentar im code!

    Warum ich das frage, werde ich nach den antworten erklären...!



  • Ja hier ist ein Memory Leak und es ist falsch wie du es löscht.

    Du versuchst das Stackobject zu löschen. Richtig wäre:

    for(unsigned i = 0; i < 3; ++i)
      delete object[i];
    

    //Edit: Knallt es eigentlich nicht? Ich meine ob die Anwendung nicht abstürzt... (Das liegt dann nämlich an dem löschen des Arrays das auf dem Stack liegt )

    BR



  • evilissimo schrieb:

    //Edit: Knallt es eigentlich nicht? Ich meine ob die Anwendung nicht abstürzt... (Das liegt dann nämlich an dem löschen des Arrays das auf dem Stack liegt )

    BR

    genau, es passiert nix...komisch is nur, das auch CodeGuard bei mir nix meldet....müsste er doch eiegntlich! (BCB 6 Enterprise)! 😮



  • Das zählt dann eben zur Rubrik undefiniertes Verhalten 😉



  • evilissimo schrieb:

    Das zählt dann eben zur Rubrik undefiniertes Verhalten 😉

    hm....dachte CodeGuard hat das bei mir immer als BadFunction angesprochen...


Anmelden zum Antworten