umm, hij word geïnitialiseerd bij de constructie, en weer vernietigd tijdens de destructie van LListquote:Op donderdag 17 maart 2011 18:33 schreef GS42 het volgende:
[..]
Dat is inderdaad een probleem, maar zijn fout wordt veroorzaakt door iets anders: bekijk je LList constructor LList(Piece start):_START(&start) eens goed. Wat klopt hier niet? (Hint: waar wordt 'Piece start' geinitialiseerd en wanneer wordt deze vernietigd?)
ja, dat dacht ik dus ook al maar als ik gewoon in de main dit schrijf:quote:Op donderdag 17 maart 2011 18:10 schreef thabit het volgende:
Je lijkt dingen te deleten die niet met new worden aangemaakt. Dat kan natuurlijk niet goed gaan.
| 1 2 3 4 | Pice myPiece; Piece *ptr; ptr = &myPiece; delete ptr; |
Je past daar pass-by-value toe. Dat ding wordt dus meteen al vernietigd bij het verlaten van de constructor.quote:Op donderdag 17 maart 2011 18:55 schreef netolk het volgende:
[..]
umm, hij word geïnitialiseerd bij de constructie, en weer vernietigd tijdens de destructie van LList
| 1 2 3 4 5 6 | int ifstr_loc = read.tellg(); while(b_temp){ read.seekg(ifstr_loc); std::cout << read.tellg( << '\n'; Handle_Function(read); } |
Ja, tenzij b_temp in Handle_Function aangepast wordt. Dan hoeft de loop niet oneindig te zijn.quote:Op zaterdag 2 april 2011 15:32 schreef netolk het volgende:
Hey heeft iemand een idee waarom dit niet werkt??
[ code verwijderd ]
als bool b_temp = true; dan zou dit toch een oneindige loop moeten vormen die steeds read op ifstr_loc zet en dan iets gaat doen??
Aannemende dat 'read' een of andere istream is, dan geeft tellg() -1 terug als deze faalt. Dit betekent hoogstwaarschijnlijk dat 'read' geen vailde status meer heeft, dus dat een of andere operatie in Handle_Function gefaald is. In het algemeen lees je nooit van een istream zonder te controleren of de istream wel leesklaar is. Probeer maar eens de statusbits van de istream af te drukken (eof, fail en bad), dan zal je zien dat dat de stream zich in een foutstaat bevindt.quote:ik krijg nu dat Handle_Function 1x word uitgevoerd en daarna is read.tellg() -1 nadat seekg(44) is aangeroepen, kan iemand mij misschien vertellen waarom read.tellg() -1 word?
Het klopt dat ik de check of ie valide is idd er niet in gedaan heb neequote:Op zaterdag 2 april 2011 18:52 schreef GS42 het volgende:
[..]
Aannemende dat 'read' een of andere istream is, dan geeft tellg() -1 terug als deze faalt. Dit betekent hoogstwaarschijnlijk dat 'read' geen vailde status meer heeft, dus dat een of andere operatie in Handle_Function gefaald is. In het algemeen lees je nooit van een istream zonder te controleren of de istream wel leesklaar is. Probeer maar eens de statusbits van de istream af te drukken (eof, fail en bad), dan zal je zien dat dat de stream zich in een foutstaat bevindt.
ahh, kijk dat verklaard een hoopquote:Op zaterdag 2 april 2011 20:21 schreef ralfie het volgende:
tellg gaf al -1? Je moet de errorbits wel resetten. Weet zo uit mn hoofd niet hoe, maar is makkelijk te googlen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Piece{ Piece *_NEXT; std::string _TYPE; std::string _NAME; void *_DATA; }; class LList{ Piece *_START; ~LList(); }; LList::~LList(){ Piece *temp1,*temp2; if(_START != 0){ temp1 = _START; while(temp1 !=0){ temp2 = temp1; temp1 = temp1->_NEXT; delete temp2; } } } |
oke, dat is mooi...quote:Op maandag 4 april 2011 23:13 schreef thabit het volgende:
Bij het deleten van Piece* wordt inderdaad de destructor van Piece aangeroepen.
um _DATA is wel een void, en als ik delete _DATA doe dan is dat dus ongedefinieerd. Ik krijg dit ook als waarschuwing als ik het wel probeerquote:Op dinsdag 5 april 2011 07:46 schreef thabit het volgende:
Je kan gewoon delete _DATA doen, de delete "weet" hoeveel ruimte het object inneemt als je het met new hebt aangemaakt.
Dat er evt. geen destructor word aangeroepen is geen probleem dat is nog wel op te lossen maar wat het is ik heb bijv.quote:Op dinsdag 5 april 2011 13:09 schreef thabit het volgende:
Maar als je het echt netjes wilt doen kun je ofwel een template maken en void vervangen door een typename binnen die template, of een base class waar je types die _DATA kunnen zijn van afleidt en dan _DATA dus als een pointer naar die base class declareren.
Het enige probleem void pointers is misschien dat er geen destructor wordt aangeroepen, dus alleen gebruiken voor pointers naar "simpele" types waar geen destructor voor nodig is.
| 1 | int *ptr_int = new int(8); |
| 1 | _DATA = ptr_int; |
Gelukkig wordt er ook maar 1 int aangemaakt door new in zijn voorbeeld.quote:Op dinsdag 5 april 2011 16:00 schreef ralfie het volgende:
Ja, dat snapt ie niet, delete zal dan simpelweg ptr_int[0] deleten en de rest laten staan.
delete [] zou dat wel goed moeten doen, maar dan moet je het wel bij arrays houden.
goed ik zal de warningcode er wel even bij plakken dan:quote:Op dinsdag 5 april 2011 16:14 schreef thabit het volgende:
[..]
Gelukkig wordt er ook maar 1 int aangemaakt door new in zijn voorbeeld.
| 1 2 | LList.cpp: In destructor `Piece::~Piece()': LList.cpp:3: warning: deleting `void*' is undefined |
Ja, maar het is dus nu juist wel de bedoeling om dit oa. ook naar classes ect te laten verwijzenquote:Op woensdag 6 april 2011 19:16 schreef thabit het volgende:
De C++ standaard definieert geen delete van void*s, maar dat betekent niet dat de compiler het niet gedefinieerd heeft.
De code werkt op vrijwel elke compiler goed, zolang de void* naar een built-in type verwijst. Als je hem naar classes laat verwijzen, dan kunnen er dingen misgaan, bijvoorbeeld omdat er dan geen destructor wordt aangeroepen.
Het memory management onthoudt de grootte van de blokken geheugen die worden gealloceerd en weet dus hoe groot het blok geheugen is waar de pointer aan verbonden is.
| 1 2 3 4 5 6 7 8 9 10 11 12 | class Piece{ Piece *_NEXT; std::string _TYPE; std::string _NAME; }; template<typename T> class TypedPiece: public Piece { T *_DATA; }; |
| 1 2 3 | Piece myPiece; myPiece._DATA = ptr_int; |
Ja, das het voordeel van templates.quote:Op donderdag 7 april 2011 20:15 schreef netolk het volgende:
Ja, dat moet ik idd hebben txs...
tja de templates heb ik idd nog niet doorgewerkt maar dat zal ik eens even gaan doen dan
Wat je nu als voorbeeld hebt gemaakt kan je dat dan toch als onderdeel van Piece aanroepen?
[ code verwijderd ]
Ik zou dit wel met accessormethodes aanpakken, niet direct van buiten de klasse in de data peuren.quote:Op donderdag 7 april 2011 20:15 schreef netolk het volgende:
Ja, dat moet ik idd hebben txs...
tja de templates heb ik idd nog niet doorgewerkt maar dat zal ik eens even gaan doen dan
Wat je nu als voorbeeld hebt gemaakt kan je dat dan toch als onderdeel van Piece aanroepen?
[ code verwijderd ]
Nee, dat is idd ook niet de bedoeling maar Piece is een onderdeel van mijn Linked List class en ik heb het dan zo gemaakt dat het alleen mogelijk is om data te wijzigen via de Linked List classquote:Op donderdag 7 april 2011 20:42 schreef thabit het volgende:
[..]
Ik zou dit wel met accessormethodes aanpakken, niet direct van buiten de klasse in de data peuren.
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |