Muss ich bei diesem Array den Speicher freigeben?



  • Hallo,

    ich habe folgendes Array im private-Abschnitt einer Klasse:

    static int const _DIM = 5 ;
    Figur const* _brett[ _DIM ][ _DIM ] ;
    

    und im Standardkonstruktor wird _brett initialisiert mit

    for ( int i = 0 ;  i < _DIM ;  ++i )
    			for ( int j = 0 ;  j < _DIM ;  ++j )
    				_brett[ i ][ j ] = NULL ;
    
    		_brett[ 0 ][ 0 ] = new Springer( Figur::WEISS ) ;
    		_brett[ 0 ][ 1 ] = new Laeufer( Figur::WEISS ) ;
    // (...) usw.
    

    Einerseits habe ich gelernt, dass "zu jedem New ein Delete" gehört. Andererseits handelt es sich aber auch nicht um ein dynamisches Array, da zur Compilezeit ja schon bekannt ist, welche Dimension das Array hat und sich diese auch nicht ändern kann und der Compiler doch dann eigentlich automatisch Code generieren könnte/würde, um den Speicher des Arrays wieder freizugeben.

    Ist das richtig? Wird es automatisch wieder gelöscht, oder muss ich der Klasse einen Destruktor geben, um den Speicher wieder freizugeben?

    Danke,
    Thilo



  • Zu jedem new gehört ein delete, richtig. Dein Array ist nicht mit new erzeugt, also solltest du es auch nicht mit delete freigeben. Die Einträge sind mit new erzeugt, also müssen sie mit delete freigegeben werden.


  • Mod

    der Compiler doch dann eigentlich automatisch Code generieren könnte/würde, um den Speicher des Arrays wieder freizugeben.

    (Ich nehme an, du meinst den Speicher auf den die Arrayelemente selbst zeigen)
    Ein paar Leute hatten dieselbe Idee wie du (RAII) und haben das ganze in ein Klassentemplate namens vector gepackt.

    Aber zuerst die wichtigste Frage: Warum allozierst du den Speicher selbst? Warum?



  • Okay, die Einträge des Arrays muss ich also wieder freigeben.

    Aber zuerst die wichtigste Frage: Warum allozierst du den Speicher selbst? Warum?

    Das Array Figur const* _brett[ _DIM ][ _DIM ] war in der Aufgabe so vorgegeben. Da bleibt mir ja dann keine andere Möglichkeit, als den Speicher selber zu allozieren, oder?



  • Thilo87 schrieb:

    Das Array Figur const* _brett[ _DIM ][ _DIM ] war in der Aufgabe so vorgegeben. Da bleibt mir ja dann keine andere Möglichkeit, als den Speicher selber zu allozieren, oder?

    Wenn das so vorgegeben ist, dann musst Du das so machen und im Destruktor der Klasse, die das Spielfeld im Constructor füllt, auch wieder aufräumen.
    Behalte aber im Kopf dass in modernem C++ "rohe" Zeiger eigentlich nicht verwendet werden. Das Sticwort RAII ist ja schon gefallen.



  • MichelRT schrieb:

    Behalte aber im Kopf dass in modernem C++ "rohe" Zeiger eigentlich nicht verwendet werden. Das Sticwort RAII ist ja schon gefallen.

    Besitzende "rohe" Zeiger sollten nicht verwendet werden.



  • btw. kommt man bei Polymorphie nur sehr schwer um rohe Zeiger herum,
    da die meisten Smartpointer keine polymorphen casts unterstützen.

    und wenn zwei Figur* mit new Springer und new Laeufer belegt werden, dann sieht das extrem nach Polymorphie aus.
    (wobei in dem Fall auch ein std::array<std::array<std::unique_ptr<Figur>, _DIM>, _DIM> gehen würde, da braucht man sich dann nicht um die deletes kümmern)



  • DrakoXP schrieb:

    btw. kommt man bei Polymorphie nur sehr schwer um rohe Zeiger herum,
    da die meisten Smartpointer keine polymorphen casts unterstützen.

    Wer polymorphe Casts benutzen muss, ist ja auch selber schuld.


  • Mod

    DrakoXP schrieb:

    da die meisten Smartpointer keine polymorphen casts unterstützen.

    Irrelevant, solange nicht der Besitz übertragen werden soll.



  • DrakoXP schrieb:

    btw. kommt man bei Polymorphie nur sehr schwer um rohe Zeiger herum,
    da die meisten Smartpointer keine polymorphen casts unterstützen.

    😕
    http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/


Log in to reply