[c++] acces violation bij verlaten programma

Pagina: 1
Acties:

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Hallo,

bij het verlaten van mijn c++ programma geeft hij een foutmelding. acces violation error. iemand een idee waar dat aan ligt, of waar dat aan kan liggen. (heeft volgens mij iets te maken met het vrijgeven van geheugen wat ie op een of andere manier niet kan)

de source kun je downlaoden (niet zo groot. is makkelijk te doen, ook met een 56k modem. hen ik hem ook mee geupt)

http://www.zantinge.tmfweb.nl/sourcecode.zip

[ Voor 5% gewijzigd door dexter07051982 op 23-02-2003 17:59 . Reden: verkeerde link (typo) ]


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Je delete vast een object dat nog niet gemaakt is dmv new.
Of je zet een pointer eerst op null en probeert hem daarna te deleten.

Ik kan niet kijken wat er precies fout is, want je site doet het niet.

After all, we are nothing more or less than what we choose to reveal.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Devil schreef op 23 February 2003 @ 17:59:
Je delete vast een object dat nog niet gemaakt is dmv new.
Of je zet een pointer eerst op null en probeert hem daarna te deleten.

Ik kan niet kijken wat er precies fout is, want je site doet het niet.
kwam ik ook achter toen ik er zelf op klikte. maar kon zo snel de fout niet vinden. (was een typo in de link bleek later)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
delete 0; is goed, dat det gewoon niets. Wat wel vaak fout gaat is dat je een tweede keer probeert een pointer te deleten (in een destructor).

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


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
MSalters schreef op 23 February 2003 @ 18:01:
delete 0; is goed, dat det gewoon niets. Wat wel vaak fout gaat is dat je een tweede keer probeert een pointer te deleten (in een destructor).
sorry, weet niet precies wat je bedoelt.
heb ik ergens delete 0; staan of probeer ik een pointer voor de 2e keer te deleten of wat?

(kijk anders a.u.b. ff in de source files. want ik weet wal dat ik niet iets kan deleten wat er niet is en volgens mij doe ik dat ook niet.)

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Dan kun je het beste je pointers in de destructors na het deleten op 0 laten zetten.

After all, we are nothing more or less than what we choose to reveal.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
delete eerst nog niks (was natuurlijk ook niet goed) maar toen deed ie het ook
haal de 3 regels met delete boven het einde in de main maar eens weg.

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Kun je niet even ee ndebug versie bouwen en als ie dan crashed kiezen voor de optie 'debug'. En dan fijn aan de slag om uit te vinden op welke regel hij precies crashed.

After all, we are nothing more or less than what we choose to reveal.


Verwijderd

C++:
1
2
3
4
5
    klassementFile.close(); // sluit de file

    Iterator<Schaatser> klassementIter(klassementList);
    Schaatser *tempSchaatser = klassementIter.select();  
    ^^^^^^^^^^ <-- hier want klassementIter == NULL

[ Voor 20% gewijzigd door Verwijderd op 23-02-2003 18:17 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Verwijderd schreef op 23 February 2003 @ 18:16:
C++:
1
2
3
4
5
    klassementFile.close(); // sluit de file

    Iterator<Schaatser> klassementIter(klassementList);
    Schaatser *tempSchaatser = klassementIter.select();  
    ^^^^^^^^^^ <-- hier want klassementIter == NULL
iets meer uitleg graag.
waarom is klassementItor NULL? kan ik namelijk niet vinden. en die delete ik toch ook niet? :?

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Ik denk niet dat dat het probleem is. klassementIter is immers geen pointer, maar gewoon een instantie van Iterator<schaatser>. Als het een pointer was geweest was de compiler volgens mij al gaan stuiteren.

After all, we are nothing more or less than what we choose to reveal.


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Ik kan me vergissen hoor, maar een beetje de debugger door je code heenhalen en je weet waar het zit lijkt me toch??

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ja, aan het einde bij het afsluiten geeft ie de fout pas. (als je gaat debuggen i.p.v. runnen natuurlijk anders krijg je alleen maar een windowsfout en weet je dus niet wanneer je die krijgt). Ik weet niet of je mijn code ook hebt gedownlaod? maar zo nee, probeer het maar eens en kijk dan ook eens waar die een fout geeft.

(is not a must voor het geval ik er anders een slotje op kan krijgen, weet ik niet zeker namelijk)

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
oh ja. misschien wel belangrijk om ff mee te geven. hij chrashed niet bij de invoer500.txt file.

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ik heb nog even verder gezocht. het zit ergens in ~SequentialList()

C++:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
template <class TYPE>
SequentialList<TYPE>::~SequentialList(void)
{
    while(theHeader->theForward != NULL)
    {
        remove(*(theHeader->theForward->theObject));
    }
    remove(*(theHeader->theObject));
}


template <class TYPE>
void SequentialList<TYPE>::remove(TYPE& object)
{
    ListNode<TYPE>* pointerPre = locate(object,TRUE);
    if (pointerPre!=NULL)
    {
        ListNode<TYPE>* pointerRemove = pointerPre->theForward;
        if (theTail==pointerRemove)
            theTail = pointerPre;
        pointerPre->theForward = pointerRemove->theForward;
        delete(pointerRemove);
    }
}

template <class TYPE>
ListNode<TYPE>* SequentialList<TYPE>::locate(const TYPE& object, Bool preDescessor=FALSE)
{
    ListNode<TYPE>* pointerThis = theHeader->theForward;
    ListNode<TYPE>* pointerPre  = theHeader;
    while (pointerThis!=NULL)
    {
        if (EQ(object, *(pointerThis->theObject)))
            if (preDescessor==TRUE)
                return pointerPre;
            else
                return pointerThis;

        pointerPre = pointerThis;
        pointerThis = pointerThis->theForward;
    }
    return NULL; 
}


maar dan weet ik nog niet wat er fout is aan die destructor. dus als iemand me daarmee verder kan helpen? (als ie leeg is doet het wel, maar volgens mij vreet dat wat geheugen of niet?)

[ Voor 7% gewijzigd door dexter07051982 op 23-02-2003 19:05 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
Kennelijk probeer je objecten te removen die er niet zijn.
Worden de pointers in je list wel op NULL geinitialiseerd? Ik zou zeggen, zet een breakpoint in je destructor en kijk waar het fout gaat.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Unicorn
  • Registratie: Maart 2000
  • Laatst online: 29-04-2024

Unicorn

rogue soeper

C++:
1
2
3
4
5
6
7
8
9
template <class TYPE>
SequentialList<TYPE>::~SequentialList(void)
{
    while(theHeader->theForward != NULL)
    {
        remove(*(theHeader->theForward->theObject));
    }
    remove(*(theHeader->theObject)); // <<< Danger, Will Robinson!
}


Ik kijk misschien ergens overheen maar volgens mij probeer je hier een NULL pointer te dereferencen.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Heb even naar je source gekeken maar hij crasht bij mij niet altijd.. Soms komt ie er gewoon helemaal doorheen, soms blijft ie hangen na een lijstje met tijden geprint te hebben en een paar keer heb ik ook echt een crash gehad in de tweede regel hier:
C++:
1
2
Iterator<Schaatser> klassementIter(klassementList);
Schaatser *tempSchaatser = klassementIter.select();

Volgens mij gebeurt dat als klassementList.add nooit aangeroepen wordt (dat was het geval toen namelijk).
Maar nu krijg ik geen crashes meer dus kan ik het niet meer proberen.

www.madwizard.org


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Devil schreef op 23 February 2003 @ 18:06:
Dan kun je het beste je pointers in de destructors na het deleten op 0 laten zetten.
Dat helpt nooit. Na je destructor zijn die pointers weg, dus de waarde die ze op dat moment hadden is volledig irrelevant. In VC++ debug mode worden ze zelfs met garbage overschreven, om te voorkomen dat je ptr=0 code iets doet.

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

Pagina: 1