Archief - [PROG][C++] Probleem met 'delete'

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Kreek

Legacy Member
Hey,

Ik heb een probleem in een member functie van mijn klasse. Ik wil een product (dynamisch?) toevoegen aan een list van producten (list<Product*> products). Daarna wil ik er een delete op uitvoeren, maar dan gaat het fout. Als ik de 'delete product' achteraan de member functie zet, dan print de functie viewProducts allerlei rare dingen uit en krijg ik ineens een chinese terminal enzo ;p

Ik heb al een paar dingen geprobeerd, maar weet niet direct een oplossing.. Hier is de code om een product toe te voegen:

Code:
bool ListProducts::addProduct(const string name)
	{
		Product* product = new Product(name);
		if(searchProduct(product)) // Search the product in the list. We may not insert a product twice.
		{
			// cout << "Product " << prod.getName() <<" already inserted.\n";
			return false;
		}
		products.push_back(product);
		cout << "Product " << product->getName() << " inserted.\n";
		return true;
	}

Daedie

Legacy Member
ge pusht ne pointer naar een bepaald segment data in uw geheugen op uw lijst (of vector of w/e), dan delete ge die data (delete product delete hetgeen ge gealloceerd hebt voor product), bijgevolg gaat de pointer op uw lijst wijzen naar "rommel". Die rommel is uw chinese text :p.

oplossingen:
- geen delete toevoegen, maar wel zorgen dat uw destructors enzo de data deletion correct afhandelen. (dit moet ge zowiezo doen, en dat doet ge mss al)
- Een lijst van producten bijhouden ipv pointers naar producten. Dan wordt de data volledig gekopieerd ipv een verwijzing naar de data.
- ... (:p)

ma ik denk dus gewoon de eerste oplossing hier van toepassing is voor u, ma ik ken de aard van uw opdracht niet.

Kreek

Legacy Member
Mja, het rare is als ik een lijst van producten bijhoudt (ipv pointers naar producten), dan crasht het programma helemaal (geen idee waarom eigenlijk). Een delete van mijn volledige lijst van producten doe ik al in mijn destructor. Maar het probleem is, ik moet die variabele product deleten binnen de member function, omdat die enkel binnen die functie bestaat (ik declareer ze daar). Als ik de delete dan binnen de member function doe, dan crasht heel da spul..

Daedie

Legacy Member
- als uw programma crasht als ge producten bijhoudt kunt ge beter zoeken achter de oorzaak ipv met pointers ineens te beginnen werken.

- leg mij es uit waarom ge die variabele _moet_ deleten? dat moet ge helemaal niet. Ge alloceert een product, ge hebt 1 product met 1 verwijzing naar dat product. ge maakt een nieuwe verwijzing naar datzelfde product in uw lijst. Ge hebt 1 product met 2 verwijzingen. Bij het eindigen van uw functie wordt uw eerste verwijzing weggegooid (bestaat enkel binnen het bereik van uw functie). Wat houdt ge over, 1 product met 1 verwijzing.

De delete functie dient om de data waarnaar verwezen wordt te vernietigen, zodat deze niet in het geheugen blijft rondhangen zonder verwijzingen (memory leak). Niet om de verwijzing te deleten :).

ps: Verwijzing slaat dus op pointers, moest dat niet duidelijk zijn ^^.

killgore

Legacy Member
it's quite easy: delete doe je pas als het object uit de lijst wordt verwijderd of hele lijst verwijderd wordt.

(wat daedalus u dus probeert te zeggen, men browser stond nog open zonder hele conversatie :))

Kreek

Legacy Member
Hmm, maar als ik met valgrind naar leaked memory check, zegt hij dat er in die functie een leak zit.. :/

killgore

Legacy Member
Kreek zei:
Hmm, maar als ik met valgrind naar leaked memory check, zegt hij dat er in die functie een leak zit.. :/

zulke memory managers zijn niet perfect :p.

Mara zoals ik zei mag je niet vergeten die data vrij te geven als ze uit lijst gegooid worden/als lijst verwijderd wordt.

Kreek

Legacy Member
Ok dan, ik verwijder nu ook de data als die uit mijn lijst gegooid worden :)

merci allebei.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan