2 Fragen zu new und delete



  • 1. Frage:
    Wenn ich eine klasse "was_weiß_ich" erstelle und dynamisch ein Array dieser Klasse anlege.

    was_weiß_ich *t = new was_weiß_ich(1000);
    

    Ruft man delete dann so auf?

    delete [1000] t;
    

    Ist das richtig?
    (Es fehlt doch irgendwie die Information für den Compiler, wie groß eigentlich ein element der Klasse "was_weiß_ich" ist, oder nicht?)

    2. Frage:
    Ist folgendes rekursive Programm in Ordnung oder wird irgendwelcher Speicher nicht freigegeben?

    #include <iostream.h>
    
    class rekursionstest {
    
    public:	static long* rek(long *Wert) {
    
    			if (*Wert>1) {
    				*Wert=*Wert-1;
    
    				long *t = new long(*Wert);
    				rek(t);
    
    				delete(Wert);
    
    				return t;
    
    			}
    			return Wert;
    
    		}
    };
    
    int main(void) {
    
    	long *wert= new long(1000); 
    	rekursionstest::rek(wert);
    	return 1;
    }
    


  • Zu 1.:

    delete [] t;
    

    Der Compile weiss, wieviel dort allociert wurde.

    Zu 2: sieht auf den ersten Blick gut aus.



  • MisterX schrieb:

    was_weiß_ich *t = new was_weiß_ich(1000);
    

    Ruft man delete dann so auf?

    delete [1000] t;
    

    Ist das richtig?

    Ich hoffe die runden Klammern sind nur Schreibfehler. Für ein Array müssen es jedenfalls eckige Klammern sein.

    MisterX schrieb:

    (Es fehlt doch irgendwie die Information für den Compiler, wie groß eigentlich ein element der Klasse "was_weiß_ich" ist, oder nicht?)

    Was heisst hier element der Klasse "was_weiß_ich"? Ich dachte, du willst ein Array erstellen, wo was_weiß_ich selbst der Elementtyp ist.

    MisterX schrieb:

    Ist folgendes rekursive Programm in Ordnung

    Nur mal ein paar Kritikpunkte
    - iostream.h ist unnötig sowie veraltet
    - C++ bedeutet nicht, Funktionen in Klassen zu stecken
    - dein Speicherhandling ist fehlerhaft
    - es ist in C++ üblich, Funktionen ohne Parameter mit leeren Klammern zu schreiben, also ohne void



  • Müsste galub so hier stehen:

    was_weiß_ich *t = new(was_weiß_ich[1000]); // --> Besorgt Speicher für 1000 was_weiß_ich Elemente

    delte[] was_weiß_ich; // Gibt den Speicher wieder Frei. Ist wichtig, wenn du mit großen Datenmengen Programmierst.



  • delete [1000] t;
    

    gab es nur im uralten AT&T 2.0 C++ Standard, als C++ noch keine Templates etc. hatte.

    Seit AT&T 3.0 reicht auch

    delete [] t;
    


  • Tc++H schrieb:

    Ist wichtig, wenn du mit großen Datenmengen Programmierst.

    😕



  • Tc++H schrieb:

    Müsste galub so hier stehen:

    was_weiß_ich *t = new(was_weiß_ich[1000]); // --> Besorgt Speicher für 1000 was_weiß_ich Elemente

    delte[] was_weiß_ich; // Gibt den Speicher wieder Frei. Ist wichtig, wenn du mit großen Datenmengen Programmierst.

    Was hat das mit der Datenmenge zu tun. 🙄



  • dein programm enthält einen kleinen fehler:

    soll wohl

    t=rek(t);
    

    anstelle von

    rek(t);
    

    heißen 😉


Anmelden zum Antworten