"delete this;"

Status
Niet open voor verdere reacties.

turbello

Gebruiker
Lid geworden
23 nov 2011
Berichten
25
Hey ik ben bezig aan het schrijven van mijn engine en ik heb een klein probleem.

Ik heb een klasse GameLoader waarin een 'new Image(..) wordt aangemaakt, en de pointer die naar het object verwijst geef ik door in de return van die methode.

Dus in mijn GameLoader hoe ik geen pointers bij die naar objecten verwijzen. Dus ik moet mijn objecten deleten in mijn game zelf.. Ik wou dit als volgt doen:


Code:
Game::~Game()
{
	m_pImage->Release();
}


void Image::Release()
{
	delete this;
	bool stillexists = this->Exists();
}

Maar die bool geeft een true terug :confused:

Dan probeerde ik dit eens:

Code:
Game::~Game()
{
	delete m_pImage;
	bool stillexists = m_pImage->Exists();
	m_pImage->Release();
	
}

void Image::Release()
{
	delete this;
	bool stillExist = this->Exists();

}

De eerste bool na "delete m_pImage; geeft een true. Dan wil ik heb releasen en bij de "delete this" crash hij. :confused:

What is going on here? Hoe krijg ik deftig mijn object weg waar mijn pointer naar verwijst?



EDIT:
Even wat staan uittesten.. Als ik de bool verander naar false zegt hij wel dat het niet meer 'bestaat'

Code:
void Image::Release()
{
	delete this;
	m_bExists = false;
}

Game::~Game()
{
	m_pImage->Release();
	bool stillexist = m_pImage->Exists(); // lukt nog steeds maar nu geeft het false terug
}

Waarom kan ik nog steeds mijn bool m_bExists veranderen terwijl het object al lang gedealloceert moest zijn?

B. Jonathan
 
Laatst bewerkt:
In je class deconstructor opruimen en de class deleten. Of op laten ruimen door de originele class.

Het verhaal is dan ook een beetje verwarrend. Je geeft de pointer terug naar je hoofdprogramma, maar waar probeer je te deleten? Rechtstreeks vanuit het hoofdprogramma?
 
Ik de constructor van het hoofdprogramma alloceer ik alle objecten via de GameLoader klasse.

Ik alloceer ze in een klasse GameLoader via ( Image* LoadImage( string path ); )
Die methode geeft de pointer terug van het object en die steek ik in een member variabele. ( m_pImage = LoadImage("path.bmp"); )

Mijn GameLoader houdt die pointer niet bij, dus enkel m_pImage heeft het adres van het object nog.
Dus als mijn hoofdprogramma sluit moet hij dat object opruimen. Daarvoor called hij Release();

In de Release klasse doe ik ( delete this; ) en die moet het object dealloceren. Maar hij doet het precies niet?
Ik vermoed dat ik zal moeten doen zoals je zegt. Alles bijhouden in de GameLoader en als de applicatie moet sluiten daarin alles deleten.
 
[CPP]delete this;
bool stillExist = this->Exists();[/CPP]

Vind je dit heel vreemd? Je dereferencet een pointer die je de regel erboven nog gedelete hebt.

Verder, "delete this;" kan ook nooit goed gaan. Je vraagt het object zichzelf te vernietigen terwijl hij zal moeten bestaan om de functie af te werken.
 
Hmm zo had ik het nog niet bekenen..
Een delete this wanneer zijn eigen methode nog niet gedaan is..

Dan zal ik in mijn GameLoader klasse een vector aanmaken die alle Image pointers bijhoudt en zodra de applicatie moet sluiten mijn vector leeg maken door alles in die vector te deleten.
Thanks voor de snelle responsen!


B. Jonathan
 
Ik had het verkeerd over "delete this;". Dit is wel mogelijk, al kun je in de rest van de functie dan niet meer gebruik maken van de member variabelen of functies van die klasse.

Het probleem is alleen dat het 'delete'n van een klasse helemaal niet de verantwoordelijkheid hoort te zijn van de klasse zelf. Waar de klasse ge'new'd is, is waarschijnlijk de beste plek om hem weer te 'delete'n.
 
Ik heb in de GameLoader destructor ( deconstructor ) dit gedaan:

Code:
	vector<Image*>::iterator pos;
	
	for( pos = m_ImageVec.begin();   pos != m_ImageVec.end();   ++pos )
	{
		delete *pos;
	}

Dit zal logischer zijn om mijn objecten terug te verwijderen. :)
Want inderdaad, het hoort niet dat het object zichzelf moet deleten via 'delete this'
Je krijgt dan 'undefined behaviour'.


B. Jonathan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan