[C++] Raar probleem!

Pagina: 1
Acties:

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Een vriendin vroeg mij vanavond wat raad over een C++ probleempje.
Eerst dacht ik dat het een standaard pointerfoutje was,
maar bij nader inzien versta ik zelf niet wat het probleem is!


Ziehier een stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Datum is gewoon een klasse met 3 int attributen: dag, maand en jaar

typedef struct{
    Datum datum;
    ...
}Promotie;

// De eigenlijke probleemcode
{
    Promotie p;
    p.datum = *vandaag;
    p.werknemer = *b;
    p.nieuweLoonschaal = b->getLoonschaal();
    promoties.push_back(p);
}



Het probleem is nu dat bij het verlaten van die scope,
de inhoud van het object 'vandaag' veranderd is naar garbage...
Hoe kan dat in godsnaam?
Ok, 'p' gaat out of scope en wordt vernietigd,
maar 'p' is helemaal onafhankelijk van 'vandaag', want:
&p.datum != vandaag . (haal ik uit de debugger)
Hoe kan het dan dat de inhoud van 'vandaag' gewijzigd wordt???


Het gebeurt nochtans in de destructor van Promotie, voor zover ik uit de debugger kan afleiden...

[ Voor 25% gewijzigd door DieterVDW op 31-08-2004 00:39 ]


Verwijderd

Is de waarde van vandaag zelf (de pointer dus) soms veranderd? Of alleen de inhoud ervan?

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
De pointer is niet veranderd, wel de waardes van de attributen...

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Ok gevonden, na véél gezwoeg!
Ik heb in de debugger eens de assembler code zichtbaar gemaakt,
en die stap voor stap doorlopen.
Blijkbaar werd er bij het out-of-scope gaan ook nog ergens een object van de klasse 'Werknemer' gedestroyed.
En wat vind ik in de constructor van die klasse:
code:
1
2
3
4
Werknemer::Werknemer(Datum* aanwerving, ...){

    this->aanwerving = aanwerving;
    ...

En natuurlijk werd 'vandaag' meegegeven in de constructor van dat object...
(De programmeerstijl is trouwens niet echt fantastisch te noemen...)


Zo zie je maar jongens en meisjes!
Pointers are EEVIILL!!!!

[ Voor 13% gewijzigd door DieterVDW op 31-08-2004 00:59 ]


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:13 ]


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Eelis schreef op 31 augustus 2004 @ 01:40:
[...]


Pointers zijn niet evil, mensen die pointers misbruiken zijn evil. :)
Gewoon gebruik van pointers zoveel mogelijk vermijden vind ik.
Tenzij het echt moet...
Je mag nog supergoed zijn met pointers (zoals ik 8) ), als je code begint te schrijven zoals hierboven vraag je om problemen...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
DieterVDW schreef op 31 augustus 2004 @ 02:25:
[...]


Gewoon gebruik van pointers zoveel mogelijk vermijden vind ik.
Tenzij het echt moet...
Je mag nog supergoed zijn met pointers (zoals ik 8) ), als je code begint te schrijven zoals hierboven vraag je om problemen...
Dat heeft niets met 'evilness' of pointers te maken; gewoon een ranzige manier van programmeren.

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Het probleem is de rule of three - als je een dtor, copy ctor of assignment nodig hebt, dan heb je (meestal) ze alle drie nodig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

DieterVDW schreef op 31 augustus 2004 @ 00:23:

code:
1
2
3
4
...
    Promotie p;
    p.datum = *vandaag;
...


maar 'p' is helemaal onafhankelijk van 'vandaag', want:
&p.datum != vandaag . (haal ik uit de debugger)
Natuurlijk is dat zo, en dat kun je al zien in de code. Op het moment dat je een Promotie aanmaakt, staat het adres van het datum veld al vast. Dit bevind zich namelijk op een vaste offset van &p en kun je dus niet meer wijzigen.

Overigens kan het nog wel zo zijn dat door bovenstaande assignment een deel van vandaag gedestruct wordt. Namelijk, als Datum pointers bevat, plus bv de default copy ctor en een dtor die de pointers delete, dan zal bij het uit scope gaan van p die pointers in vandaag ook garbage zijn (maar vandaag zelf zal nog wel bestaan).

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

DieterVDW schreef op 31 augustus 2004 @ 02:25:
Gewoon gebruik van pointers zoveel mogelijk vermijden vind ik.
Tenzij het echt moet...
Sja.. Je kan logisch nadenken en programmeren of niet. Dat heeft niks met pointers te maken.

Verwijderd

igmar schreef op 31 augustus 2004 @ 12:15:
[...]

Sja.. Je kan logisch nadenken en programmeren of niet. Dat heeft niks met pointers te maken.
Inderdaad. Als je niet al te veel over pointers wilt nadenken kun je beter een taal als Java gebruiken. En voordat iemand de bekende vergissing maakt; Java heeft juist -alleen maar- pointers voor objecten. Je hoeft ze echter niet zelf te deleten en dus ook geen reference count oid bij te houden.

Overigens zal de introductie van shared_ptr in de std lib het gebruik in veel gevallen ook alweer een stuk makkelijker maken (naar mijn mening).

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Verwijderd schreef op 31 augustus 2004 @ 14:15:
[...]
Overigens zal de introductie van shared_ptr in de std lib het gebruik in veel gevallen ook alweer een stuk makkelijker maken (naar mijn mening).
Die shared_ptr is idd wel interessant!
Waarom heb ik daar nog nooit van gehoord ...
Sinds wanneer bestaat dat?
Waar zit de definitie van die shared_ptr ergens in vervat?
Of is die onderdeel van de taal dan eigenlijk?

Verwijderd

DieterVDW schreef op 31 augustus 2004 @ 16:05:

Die shared_ptr is idd wel interessant!
Waarom heb ik daar nog nooit van gehoord ...
En dat vraag je aan mij? ;)
Sinds wanneer bestaat dat?
Waar zit de definitie van die shared_ptr ergens in vervat?
Of is die onderdeel van de taal dan eigenlijk?
Zie google, bv eerste hit:
http://www.boost.org/libs/smart_ptr/shared_ptr.htm

shared_ptr komt uit de boost library en wordt op dit moment toegevoegd aan de standaard library. In het algemeen is de shared_ptr een smart pointer, net zoals auto_ptr die nu al in de stl zit. auto_ptr heeft echter wat nadelen. De stelling is dat je met shared_ptr eigenlijk geen auto_ptr meer hoeft te gebruiken. shared_ptr is overigens niet perfect. Er valt nog veel meer te zeggen over smart pointers, maar dit is ongeveer het idee.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
offtopic:
DieterVDW, ben jij van Tielt ofzo?

https://fgheysels.github.io/


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
whoami schreef op 31 augustus 2004 @ 16:29:
offtopic:
DieterVDW, ben jij van Tielt ofzo?
offtopic:
Ja! Hoe weet je dat in godsnaam als ik vragen mag? 8)7

  • lux
  • Registratie: Juni 2004
  • Laatst online: 19-05 14:15

lux

wat bedoelen jullie met pointers? is dat hetzelfde als referenties?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

C++:
1
2
int * pointer;
int & referentie;


Dit is overigens gewoon normaal C++ taalgebruik, wellicht is het handig om er een boek over open te slaan?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1