new / delete



  • Hi,

    bin neu in dem Forum und versuche jetzt mal nicht gegen allztuviele Regeln zu verstoßen ;-).
    Also es geht um folgendes, wann benutzt man eigentlich new und delete ( deletete ist mir glaub ich klar geht eher ums new).
    Wann ist es nötig sich speicher zu reservieren. Reicht es nicht einfach ne Variable zu machen und gut ist?
    Ich bin auch neu in der C++ Sprache, mache das erst seit einen Monat und hoffe deswegen auf verständniss, falls diese Frage zu primitiv ist.

    mfg

    js-mueller



  • new brauchst du, wenn du Daten nicht auf dem üblichen Variablen-Stack sondern auf dem Heap ablegen willst. Mit delete gibt man diese Daten dann wieder frei, wenn du sie nicht mehr brauchst.
    Wenn du new anwenden willst, musst du vorher einen Zeiger deklarieren, der denselben Typ hat, wie die Daten, die du mit new auf dem Heap ablegen willst.
    ... ööhm ist das einigermaßen verständlich? Ich hoffe, ich habe mich nicht zu unklar ausgedrückt 🙂



  • du brauchst new und delete wenn du entweder viel speicher brauchst oder selbst bestimmen willst wann eine variable gelöscht wird

    void func()
    {
    int val;
    int *pval=new int;
    
    return;
    //val is weg aber den integer auf den pval zeigt gibts noch
    }
    


  • new wird häufig dann benutzt, wenn zur compilezeit noch nicht gesagt werden kann,wieviele objekte eines typs man in einem array hat.
    desweiteren wird new immer dann benutzt, wenn man den speicher besonders verwalten will,da man mittels delete dann selber bestimmen kann, wann das objekt zerstört werden soll.
    es gibt noch einen 3. bereich,und zwar die "basisklassenzeiger"in der polymorphie, aber das lernt man besser,wenn man die grundlagen hat 😉

    für den anfang reicht es zu wissen, dass man genau dann wenn ein objekt dynamisch erstellt werden soll, man ein new braucht.



  • [Da die anderen schon alles gesagt haben, ziehe ich mich als letzter zurück]



  • Hallo,

    es gibt noch einen 3. bereich,und zwar die "basisklassenzeiger"in der polymorphie, aber das lernt man besser,wenn man die grundlagen hat

    Das hat aber nix mit new oder delete zu tun.



  • CarstenJ schrieb:

    Hallo,

    es gibt noch einen 3. bereich,und zwar die "basisklassenzeiger"in der polymorphie, aber das lernt man besser,wenn man die grundlagen hat

    Das hat aber nix mit new oder delete zu tun.

    er meint wahrscheinlich
    baseclass* ptr=new abgeleitet;



  • Sovok schrieb:

    er meint wahrscheinlich
    baseclass* ptr=new abgeleitet;

    Na und?
    new/delete hat erstmal garnix mit Polymorphie zu tun.



  • Shade Of Mine schrieb:

    Sovok schrieb:

    er meint wahrscheinlich
    baseclass* ptr=new abgeleitet;

    Na und?
    new/delete hat erstmal garnix mit Polymorphie zu tun.

    d.h man kann dasselbe auch ohne new machen? 🙄



  • Sovok schrieb:

    Shade Of Mine schrieb:

    Sovok schrieb:

    er meint wahrscheinlich
    baseclass* ptr=new abgeleitet;

    Na und?
    new/delete hat erstmal garnix mit Polymorphie zu tun.

    d.h man kann dasselbe auch ohne new machen? 🙄

    sicher

    B b;
    A* a = &b;
    


  • ups stimmt ja
    ok gewonnen 🙂



  • mit new is es aber viel viel schöner 😉



  • otze schrieb:

    mit new is es aber viel viel schöner 😉

    mit new is es aber viel viel anders 😉



  • otze schrieb:

    mit new is es aber viel viel schöner 😉

    was soll bitte daran so schön sein?



  • wenn du die klasse über einen basiszeiger-und idealerweise über ein interface-verwaltest,brauchst du eigentlich die abgeleitete Klasse nicht zum direkt aufrufen,weil ja das interface diese aufgaben perfekt erledigen sollte.darum sollte man sich dieses zusätzliche objekt im code sparen, und direkt mit new instanzieren.hat den vorteil der übersichtlichkeit, und ein übersichtlicher code ist gleich viel schöner.
    aber das is wie gesagt nur meine meinung,und für den fall das ich ganz falsch liegen sollte bin ich ja noch lernfähig 😉



  • Hallo,

    das versteh ich irgendwie nicht. Hast du mal ein Beispiel?



  • CarstenJ schrieb:

    Hallo,

    das versteh ich irgendwie nicht. Hast du mal ein Beispiel?

    das würde dann so aussehen:

    struct A
    {
    	virtual void foo1() = 0;
    	virtual void foo2() = 0;
    	virtual void foo3() = 0;
    };
    
    //Implementierung
    class B :
    	public A
    {
    	//viele Methoden, die man nicht braucht
    	//auch unübersichtlich
    };
    
    A* p = new B;
    

    zumindest zum Teil hat er recht



  • ganz einfach:

    //ohne new
    B b;
    A* a = &b;
    //mit new und angepasstem interface
    A* a=new B;
    a->Release;//alternativ delete a
    //objekt is aufm heap man kann also seine existenzdauer selber bestimmen,
    //desweiteren gibts kein b objekt, man kann das interface also nicht (ausversehen)umgehen.
    


  • Ah, jetzt weiss ich was du meinst. Danke.



  • otze schrieb:

    aber das is wie gesagt nur meine meinung,und für den fall das ich ganz falsch liegen sollte bin ich ja noch lernfähig 😉

    Lies meinen Beitrag.

    Es sind einfach 2 verschiedene Sachen. Die nun wirklich nix miteinander zu tun haben. Einzige Gemeinsamkeit: man hat einen 'polymorphen' Zeiger.


Anmelden zum Antworten