[C++] deleten van een list

Pagina: 1
Acties:

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
hallo tweakerts,

ik probeer een list met als inhoud een aantal pointers weg te gooien dmv delete. Even een voorbeeldje schetsen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>
using namespace std;

void main() {
  list<A*>* myList = new list<A*>[10];    // in mn eigen prog heb ik die 10 natuurlijk variabel ;)
  
  // Even objecten dr in
  list.push_back(new A());
  list.push_back(new A());

  ...

  // Klaar met gebruik, verwijder
  delete myList;
}


Zoals je kunt zien, bevat het list object nu 2 pointers naar objecten. Mijn vraag is dus: als ik het myList object zo delete, worden dan automatisch de pointers die hij heeft ook verwijderd of moet ik dat handmatig doen?

Ik kon er op google zo snel niet iets over vinden..
Ik heb wel een donkerbruin vermoeden dat ik het handmatig moet doen, maar ik wil het toch graag even zeker weten

alvast bedankt! :)

Verwijderd

ja, je moet het zelf deleten. De list kan natuurlijk niet automatisch al zijn elementen deleten - wat als er nog andere objecten zijn die een pointer naar die objecten gebruiken?

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
bedankt voor je snelle reactie!
ik was er inderdaad eigenlijk wel vanuit gegaan dat het niet zo was, maar ik kon het niet vinden..
thnx!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

C++:
1
delete [] myList;

Dat zou, AFAIK, de destructor voor elk element in je list moeten aanroepen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
zou ook kunnen...
dan moet ik toch eerst delete[] myList; doen en daarna nog een keer delete myList; ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
-NMe- schreef op vrijdag 09 februari 2007 @ 17:24:
C++:
1
delete [] myList;

Dat zou, AFAIK, de destructor voor elk element in je list moeten aanroepen. :)
De destructor van de list roept ie ook wel aan.

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.


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

-NMe- schreef op vrijdag 09 februari 2007 @ 17:24:
C++:
1
delete [] myList;

Dat zou, AFAIK, de destructor voor elk element in je list moeten aanroepen. :)
Klopt, maar een destructor van een pointer delete niet het object waarnaar verwezen wordt - het is gewoon een no-op :)

Kijk anders eens naar boost::pointer_container of boost::shared_ptr

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.


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
goed.. ik vertrouw op jullie ;)

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op vrijdag 09 februari 2007 @ 17:35:
[...]


De destructor van de list roept ie ook wel aan.
Alleen wordt die niet aangeroepen zonder delete[] ;) (en delete is gewoon fout zoals het in de TS staat, het is een array, geen losse pointer)

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.


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar goed, nu iedereen wat geroepen heeft is het wellicht handig om ter verduidelijking te zeggen wat nu eigenlijk zou moeten ;)

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
#include <list> 
using namespace std; 

int main()  // return-type van main() is int, niet void
{ 
  list<A*>* myList = new list<A*>[10];    // in mn eigen prog heb ik die 10 natuurlijk variabel ;) 
   
  // Even objecten dr in 
  myList[0].push_back(new A()); 
  myList[1].push_back(new A()); 

  ... 

  // Klaar met gebruik, verwijder 
  for (int i = 0; i < 10; i++)
  {
    while (!myList[i].empty())
    {
        delete myList[i].front();
        myList[i].pop_front();
    }
  }

  delete[] myList;   // gebruik delete[] voor arrays, niet delete
}


Maar handiger is:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <list>
#include <vector>
#include <boost/ptr_container/ptr_list.hpp>

int main()
{
  std::vector<boost::ptr_list<A> > myList(10);

  // Even objecten dr in 
  myList[0].push_back(new A()); 
  myList[1].push_back(new A()); 

  ... 

  // Klaar met gebruik, verwijder 
  // gaat allemaal automatisch :P
}

[ Voor 24% gewijzigd door .oisyn op 09-02-2007 17:47 ]

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.


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
thnx .oisyn..
ik had het voorbeeldje even snel getypt.. kweet dat er een aantal dingen niet helemaal klopten ;)

edit: sinds ik vorig thema op de opleiding asp.net heb gedaan... ben ik niet zown voorstander meer van 'automatisch' ;)
toch bedankt :p

[ Voor 40% gewijzigd door martennis op 09-02-2007 17:49 ]


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

martennis schreef op vrijdag 09 februari 2007 @ 17:45:
edit: sinds ik vorig thema op de opleiding asp.net heb gedaan... ben ik niet zown voorstander meer van 'automatisch' ;)
Dan moet je geen C++ gaan programmeren, want RAII is toch wel een heel erg belangrijk concept binnen C++. Maar ja, als jij wilt dat je graag geheugen lekt (in het minst erge geval) omdat je per ongeluk vergeet iets vrij te geven moet je dat helemaal zelf weten ;)

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