Gå til innhold

[Løst] Problemer med sletting i liste over pekere


Anbefalte innlegg

Hei! Jobber med en innlevering til skolen og har i den forbindelse forsøkt å lage meg en baseklasse så jeg slipper å gjenta en haug med kode. Klasser som deriverer fra denne har en liste med pekere til komponenter av template-typen som kan manipuleres med to funksjoner, for å legge til og fjerne komponenter igjen.

 

De fleste deriverte klassene av denne har en template-type der komponentene har en standardfunksjon, og kan iterere over komponentene og kalle på denne standardfunksjonen for hvert av dem. Hvert av komponentene har så selv kontroll over når de blir slettet, ved å ha en referanse til den deriverte klassen med komponentene og kalle på den via f.eks. parent->Remove(this). Koden er under:

 

#ifndef _CComponentManager_h
#define _CComponentManager_h

#include "Includes.h"

// Base class with helper functions for managers with a container of components to update
template <typename T> class CComponentManager
{
public:
// Push a new component onto the top
void CComponentManager<T>::Push(T *t)
{
	m_components.push_back(t);
}

// Remove a component
void CComponentManager<T>::Remove(T *t)
{
	for (vector<T *>::const_iterator i = m_components.begin(); i != m_components.end(); ++i)
	{
		if (*i == t)
		{
			m_components.erase(i);
			delete t;
			break;
		}
	}
}

protected:
vector<T *> m_components;
};

#endif

 

Meningen er da at når et komponent kaller på Remove(this) skal det finne pekeren sin i listen, slette denne derfra og så slette objektet som pekes til fra minnet. Problemet er at pekeren blir slettet, men destruktøren til komponentet som slettes blir aldri kalt på. Dette tolker jeg dithen at delete t i Remove-funksjonen ikke faktisk sletter objektet (for delete skal vel kalle på destruktøren til objektet som slettes?). Jeg er ganske fersk med pekere så det er godt mulig at dette er obvious, og da beklager jeg at jeg spør dumt, men kan noen forklare meg hvorfor dette ikke fungerer? Når jeg legger til nye komponenter er det på formen parent->Push(new Component()); hvis det er relevant.

 

Hva gjør jeg feil? Hvordan får jeg objektet til å faktisk slettes så destruktøren også kalles?

 

EDIT: Fant vel egentlig ut av det, disse komponentene bestod også av deriverte klasser, og jeg hadde glemt å sette virtuell destruktør på baseklassene der.

Endret av Wedvich
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...