Frage zur Speicherfreigabe



  • Angenommen ich habe so eine Klasse:

    class Data {
    static const int bufferSize = 100;
    char buffer[buffersize];
    }
    

    Muss ich dann einen Destruktor bauen in dem ich den buffer explizit wieder freigeben muss?



  • HändyÄndy schrieb:

    Angenommen ich habe so eine Klasse:

    class Data {
    static const int bufferSize = 100;
    char buffer[buffersize];
    }
    

    Muss ich dann einen Destruktor bauen in dem ich den buffer explizit wieder freigeben muss?

    Nein.
    Aber es müsste so heissen:

    char buffer[bufferSize];
    

    Und nach der schliessenden geschweiften Klammer am Ende fehlt ein Semikolon 😉



  • Danke.



  • HändyÄndy schrieb:

    Angenommen ich habe so eine Klasse:

    class Data {
      static const int bufferSize = 100;
      char buffer[bufferSize];
    };
    

    Muss ich dann einen Destruktor bauen in dem ich den buffer explizit wieder freigeben muss?

    Ich schätze, Du stellst diese Frage, weil Du nicht genau weißst, was ein Feld ist. Wenn Du das [] weglässt, wird es genau ein char-Objekt als Datenelement in der Klasse geben. Da muss man natürlich nichts extra freigeben. Wenn Du [1] anhängst, gibt es auch nur dieses eine char-Objekt. Der Zugriff sieht etwas anders aus, aber das Speicherlayout der Klasse läuft auf dasselbe hinaus. Wenn Du [n] anhängst, landen eben n char-Objekte in der Klasse, die sich über die entsprechende Indizes ansprechen lassen.

    Vor allen Dingen ist ein 'buffer' hier nicht so etwas wie eine Referenz, welche nur auf das Feld zeigt, wie es in anderen Sprachen der Fall ist (zB Java). In C++ gibt es nur diese Indirektion, wenn Du sie explizit verlangst.

    Hier wird 'buffer' natürlich als Teil von 'Data' ordnungsgemäß von ganz alleine zerstört, wenn das entsprechende Data-Objekt zerstört wird.

    Wenn Du allerdings so Dinge schreibst wie das hier:

    class Data {
      static const int bufferSize = 100;
      char* buffer;
    };
    

    dann ist 'buffer' eben nur ein Zeiger. Der Zeiger wird als Datenelement automatisch mit einem Data-Objekt zerstört, das worauf er möglicherweise zeigt natürlich nicht.


Log in to reply