Destructor in einer Liste korrekt anrufen



  • Hallo zusammen
    Ich habe eine Klasse LED und eine Klasse Signal, welche als Member einen Vektor auf LED hat. Der Grund ist, dass die Anzahl im Voraus nicht bekannt ist, vielleicht gibt es eine bessere Lösung.
    Ich erstelle dann eine Liste (vektor) mit verschiedenen Objekten unteranderem auch vom Typ Signal
    Bei Änderung der Konfiguration muss die gesamte Liste gelöscht und neu erstellt werden. Leider wird dabei nicht der gesamte Speicher der Liste decoder freigegeben. Ich vermute das der Destructor der Klasse Signal nicht korrekt angerufen wird. Funktioniert das so wie ich das gemacht habe und wenn nein wie muss ich es anstellen das der Destructor korrekt angerufen und ausgeführt wird.

    Gruss
    Andy

    class LED {
    protected:
    	int m_Channel;
    	bool m_active;
    public:
    	LED(uint8_t Channel_);
    	void process();
    	void on();
    	void off();
    	bool isOn();
    };
    
    class Signal : accessories public{
    protected:
    	std::vector<LED*> m_LED;
    	uint8_t m_Step;
    	uint8_t m_Anzahl;		// Wieviele Ausgänge sollen verwendet werden
    public:
    	Signal(uint16_t BaseAddress_, uint8_t BaseChannel_, uint8_t Anzahl);
    	~Signal();
    };
    
    Signal::Signal(uint8_t BaseChannel_, uint8_t Anzahl_):
    	m_Anzahl(Anzahl_) {
    
    	// Anzahl LED's erstellen
    	for (int i_ = 0; i_ < Anzahl_; i_++) {
    		m_LED.push_back(new LED(BaseChannel_ + i_));
    	};
    
    };
    
    Signal::~Signal() {
    	for (int i = 0; i < m_LED.size(); i++) {
    		Signal* LED_ = m_LED[i];
    		delete LED_;
    	};
    };
    
    vector<accessories*> decoder
    
    decoder.push_back(new Signal(Channel_, 5));
    decoder.push_back(new Signal(Channel_, 5));
    
    Some Code
    
    for (int i = 0; i < decoder.size(); i++) {
    	accessories* decoder_ = decoder[i];
    	delete decoder_;
    };
    


  • Warum machst du hier nochmal eine Zuweißung?

    Signal* LED_ = m_LED[i];
    accessories* decoder_ = decoder[i];
    

    Ruf doch einfach

    delete m_LED[i];
    

    auf.

    Hast du dir die Destruktoren schon mal mit einem Debugger angeschaut?



  • Du kannst deinen Code reduzieren, wenn du die LED-Elemente selbst (anstatt als Zeiger) abspeicherst:

    std::vector<LED> m_LED;
    

    So brauchst du dich nicht um die Freigabe selbst zu kümmern.

    Und bei den 'accessories' auch (sofern du keine Polymorphie benutzt).

    PS: Die Zeile 35 sollte einen Compilerfehler erzeugen 😕



  • Du zeigst accessories nicht. Wenn der Destruktor nicht virtual ist, wird der Destruktor von Signal in der Tat nicht aufgerufen.



  • Ups: accessories ist ja die Basisklasse von Signal, dann natürlich polymorph.



  • Hallo zusammen

    Vielen Dank für eure zahlreichen Hinweise, ich bin erst heute wieder dazugekommen hier weiter zu machen.

    axels. schrieb:

    Warum machst du hier nochmal eine Zuweißung?

    Signal* LED_ = m_LED[i];
    accessories* decoder_ = decoder[i];
    

    Ruf doch einfach

    delete m_LED[i];
    

    auf.

    Hast du dir die Destruktoren schon mal mit einem Debugger angeschaut?

    Habe ich nun so umgesetzt. Debugger ist leider mit dem Arduino nicht so einfach 😞

    Th69 schrieb:

    Du kannst deinen Code reduzieren, wenn du die LED-Elemente selbst (anstatt als Zeiger) abspeicherst:

    std::vector<LED> m_LED;
    

    So brauchst du dich nicht um die Freigabe selbst zu kümmern.

    Habe ich auch versucht, dann reicht aber komischerweise der Memory nicht mehr.

    manni66 schrieb:

    Du zeigst accessories nicht. Wenn der Destruktor nicht virtual ist, wird der Destruktor von Signal in der Tat nicht aufgerufen.

    Das war die Lösung. Vielen Dank!
    Gruss
    Andy


Log in to reply