Kann man nur Zeiger von Objekten deleten?



  • Hallo habe kurz folgende Frage an Euch:

    Hab ein Klasse die ein Array deklariert und meine Objekte hinzufügt.

    Wenn ich in der Main nun das Objekt aufrufe also das Objekt das meine
    Arrayelemente listet.Geht das nur wenn ich ein Zeiger auf ein Objekt habe? Also:

    CUsedLEDs* list2 = new CUsedLEDs(3);
    

    Wenn ich zum Beispiel hier:

    CUsedLEDs list1(3);
    

    versuchen würde zu deleten... sagt der Compiler das er einen Zeiger zum deleten
    erwartet.

    Nun meine allgemeine Frage ( Klausur relevant für mich ) kurz und knapp beantwortet bitte damit ich mir das merken kann und wenn der Prof in der
    Klausur explizit fragen sollte, ich weiß wenn das Schlagwort kommen sollte zum deleten einer Liste damit ich weiß was zu tuen ist.

    Weil

    CUsedLEDs* list2 = new CUsedLEDs(3);
    delete list2;
    

    geht einwandfrei ...

    Aber:

    CUsedLEDs list1(3);
    delete list1;
    

    geht nicht!

    Hier noch meine .cpp:

    CUsedLEDs::CUsedLEDs(unsigned int maxLeds)
    {
    	if ( maxLeds > 0 )
    	{
    		m_maxLeds = maxLeds;
    	}
    	else
    	{
    		m_maxLeds = 5;
    	}
    
    	m_leds = new CLED[m_maxLeds];
    	m_countLeds = 0;
    }
    
    CUsedLEDs::~CUsedLEDs()
    {
    	delete [] m_leds;
    }
    
    bool CUsedLEDs::addLED(CLED led)
    {
    	if ( m_countLeds >= m_maxLeds )
    	{
    		return false;
    	}
    
    	m_leds[m_countLeds] = led;
    	m_countLeds++;
    	return true;
    }
    
    void CUsedLEDs::print()
    {
    	cout << m_countLeds << " von maximal " << m_maxLeds << endl;
    
    	for ( unsigned int i = 0; i < m_countLeds; i++ )
    	{
    		m_leds[i].print();
    	}
    }
    

    Ich weiß mein destructor deleted mein Objekt aber wenn ich es wie mein Prof
    will explizit in der Main haben will.

    Vielen Dank im Voraus


  • Mod

    Du solltest daran arbeiten, deine Gedanken besser zu ordnen und dich aufs Wesentliche zu konzentrieren. Ein paar mehr Kommas wären auch nicht schlecht.

    buu2188 schrieb:

    Nun meine allgemeine Frage ( Klausur relevant für mich ) kurz und knapp beantwortet bitte damit ich mir das merken kann und wenn der Prof in der
    Klausur explizit fragen sollte, ich weiß wenn das Schlagwort kommen sollte zum deleten einer Liste damit ich weiß was zu tuen ist.

    Das ist sehr viel (auch Irrelevantes) geschrieben, die Frage selbst hast du aber offenbar unterschlagen.

    Die einzige Frage überhaupt ist ja diese:

    buu2188 schrieb:

    Hallo habe kurz folgende Frage an Euch:

    Hab ein Klasse die ein Array deklariert und meine Objekte hinzufügt.

    Wenn ich in der Main nun das Objekt aufrufe also das Objekt das meine
    Arrayelemente listet.Geht das nur wenn ich ein Zeiger auf ein Objekt habe?

    Ich verstehe die Frage nicht. Was sollen "geht" und "das" hier bedeuten?
    Wenn sich "das" auf die folgende Problematik beziehen sollte, bedürfte es ja der ganzen Einleitung nicht, und in diesem Fall

    buu2188 schrieb:

    Wenn ich zum Beispiel hier:

    CUsedLEDs list1(3);
    

    versuchen würde zu deleten... sagt der Compiler das er einen Zeiger zum deleten
    erwartet.

    beantwortet der Compiler die Frage schon.
    delete dient ausschließlich dazu, Objekte, die mittels new erzeugt (d.h. Speicherreservierung+Konstruktion) wurden, zu zerstören und deren Speicher freizugeben.
    Argument von delete ist dabei der Wert, den new ursprünglich zurückgegeben hat, also ein Zeiger auf das jeweilige Objekt.

    In

    CUsedLEDs list1(3);
    

    wird list1 nicht per new erzeugt. Mithin ist es weder notwendig noch zulässig, dieses Objekt mit delete zu zerstören.
    Benannte Objekte werden ohne explizites Zutun des Programmiers zerstört und ihr Speicher freigegeben, wenn der Scope, in dem die Definition steht, verlassen wird, bzw. am Ende des Programmes für Objekte mit statischer Speicherdauer.


Anmelden zum Antworten