Heapobjekt-Lebensdauer



  • Ich habe eine Klasse, die irgendwo mit new
    erzeugt wird.

    In dieser Klasse werden mehrere Objekte einer anderen Klasse
    (classB) angelegt.

    An welcher Stelle und wie sollte man dafür Sorge tragen, dass classB-Objekte
    wieder deleted werden?

    class A
    {
    public:  
     A() { }
     ~A(){ }  
        ...
    };
    
    A:A{
    }
    
    A:Funktion()
    {
    for (int i = 0; i < size; i++)
    	{		
               classB *test = new classB;  
    	}		
    
    }
    


  • Hi,

    da Du Dir die Adresse nicht merkst, solltest Du die erzeugten Objekte unmittelbar nach dem Erstellen wieder löschen.

    VG


  • Mod

    TauCeti schrieb:

    Ich habe eine Klasse, die irgendwo mit new
    erzeugt wird.

    Da hast du schon dein Problem. Wieso? new solltest du in C++ niemals brauchen. Ressourcen wie Speicher werden immer in dafür vorgesehenen Halterobjekten verwaltet, dann kann man gar nichts mehr falsch machen mit der Freigabe.

    Hier ist aber nicht einmal ersichtlich, wieso überhaupt das Objekt dynamisch erzeugt wird.



  • TauCeti schrieb:

    Ich habe eine Klasse, die irgendwo mit new
    erzeugt wird.

    In dieser Klasse werden mehrere Objekte einer anderen Klasse
    (classB) angelegt.

    An welcher Stelle und wie sollte man dafür Sorge tragen, dass classB-Objekte
    wieder deleted werden?

    class A
    {
    public:  
     A() { }
     ~A(){ }  
        ...
    };
    
    A:A{
    }
    
    A:Funktion()
    {
    for (int i = 0; i < size; i++)
    	{		
               classB *test = new classB;  
    	}		
    
    }
    

    Spätestens dort, wo du den Verweis (also die Adresse) von dem classB Objekt verlierst. In deinem Fall: spätestens am Ende der Schleife musst du delete test aufrufen.

    Ansonsten halte dich daran was SeppJ sagt - new braucht man fast nie und es ist oft auch eine schlechte Idee. In deinem Code kannst du auch classB test schreiben, dann brauchst du dich um new/delete erst gar nicht kümmern.



  • eigentlich gibts schon sowas "Design Regeln" dafür.

    Und die lautet eigentlich:
    "im Selben context" !

    Was soviel bedeutet wie:
    innerhalb der selben funktion / block
    Konstruktor/Destruktor
    create/release Methoden bei externen zugriffen

    das ist aber eher traditionell.

    im "modernen" C++ gibts keinen Grund mehr, new und delete "unabhängig" aufzurufen.
    besser: smartpointer und andere container

    Ciao


Log in to reply