[c++] destructor problemen

Pagina: 1
Acties:

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Ik heb een Node die een child en een sibling heeft. Als ik een child wil setten, moet ie dus de ouwe weggooien, alleen krijg ik een error.

child & sibling zijn van het type Node *

De error die ik krijg zit bij de delete in setChild(...)
_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

deze error zegt me niet zoveel, maar als ik de delete weghaal, werkt ie wel... of als ik this->child = c weghaal, werkt ie ook :?

Hier de relevante code inclusief de destructor die (mijns inziens) aangeroepen wordt door de delete:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Node::setChild(Node * c)
{
    if( child ) {
        delete child;
    }

    this->child = c;
}

Node::~Node()
{
    if( child ) {
        delete child;
    }

    if( sibling ) {
        delete sibling;
    }

    if( c ) {
        delete c;
    }
}

ow ja, die c is van het type Component (class) wat dus de inhoud van een Node is

[ Voor 13% gewijzigd door erkje op 26-03-2004 13:04 ]

taste and see that the Lord is good


  • devvy
  • Registratie: Augustus 2003
  • Laatst online: 21-05 14:43
Wat ik zou kunnen bedenken is, dat je de childNode na de setChild() ook nog ergens anders ge-delete wordt.
Dus iets in de geest van:

C++:
1
2
obj.setChild(child);
delete child;

https://photune.blogspot.com/


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Het kan ook goed fout gaan als er ergens een cykel in je graaf zit. Ik weet niet precies wat voor structuur je hebt maar als het zo iets is:

node 
  |
 node    -> node(3)
  |             |
 node(1) -> node(2)


En je wist node (1) dan wordt 2 ook gewist, maar dat weet 3 niet. Als die dan gewist wordt gaat die voor de tweede keer 2 wissen...crash.

Misschien moet je alleen children wissen, en geen siblings. Of reference counting smart pointers...

[ Voor 25% gewijzigd door Zoijar op 26-03-2004 13:30 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Rule of three:
Als je een destructor, copy ctor of copy assignment operator hebt, dan heb je ze waarschinlijk 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


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
in dit stukje:
C:
1
2
3
if( c ) {
        delete c;
} 


is de 'c' wel een globaal?
of is dit alleen een tijdelijke lokale var zoals je die daarboven gebruikt hebt?

[ Voor 5% gewijzigd door cobratbq op 26-03-2004 14:04 ]

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:50

.oisyn

Moderator Devschuur®

Demotivational Speaker

Geef eens wat meer info, hier kunnen we niets mee. Laat bijvoorbeeld eens zien hoe je de boomstructuur in elkaar zet

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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Owhja, en dit
C++:
1
2
if( blaat )
    delete blaat;


is een beetje onzinning, delete van een 0 pointer is een no-op.

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.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-05 20:13
TS is bekende van me, heb in z'n code gekeken en volgens mij delete hij een pointer die helemaal niet aangemaakt is met new... 8)7

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1