Newsgroup: it.comp.lang.c++
Titolo: sulle liste e loro uso

Ok, ho ancora bisogno di aiuto sull'utilizzo delle liste...
ho una classe contenitore
class Contenitore {
public:
...
private:
list<Backup> lista_backup
}
e una classe Backup che serve a contenere svariati dati
class Backup {
public:
    Backup(int n, const char* nome)
    ...
private:
    string name;
    int id;
}
I miei problemi sono i seguenti:
1 - Non so come specificare che la lista deve essere inizialmente vuota.
2 - Non so come passare i parametri al costruttore Backup(int, const char*)
nel momento in cui inserisco elementi nella lista
3 - Conviene creare una lista di puntatori a oggetti Backup invece di una
lista di oggetti Backup e poi assegnare a ognuno un'area di memoria tramite
la new()?
4 - Sapreste farmi un esempio semplice ed efficace sull'uso dell'allocatore
nella definizione di una lista o di un vector?
grazie mille e scusate la perdita di tempo
--
Bruno

 dell'allocatore nella definizione di una lista o di un vector?
#include <iostream>
#include <list>
using namespace std;
class Backup {
public:
  Backup(int _value) : value(_value) { }
  int value;
};
int
main()
{
  list<Backup* > lista_backup;
  cout << "lista size = " << lista_backup.size() << endl;
  lista_backup.push_back(new Backup(1));
  lista_backup.push_back(new Backup(2));
  cout << "last value = " << (lista_backup.back())->value << endl;
  lista_backup.pop_back();
  Backup* apointer = lista_backup.back();
  cout << "first value = " << apointer->value << endl;
  return 0;


   return 0;
Bravissimo. Ora spiegami dove avvengono i delete degli oggetti Backup di cui hai
fatto il new inlinea nella chiamata a lista_backup.push_back. Io dico che non
avvengono e che se prosegui su questa strada ti trovi con il piu' classico dei
memory leaks.
Proprio per questo dico che usare una lista di puntatori e' pericoloso: troppo
facile dimenticarsi qualche delete.
Comunque mi pareva che la domanda avesse a che fare con l'allocator, ovvero il
secondo parametro del template "std::list< class T, class
Allocator=std::allocator<T> >". Ma forse mi sbaglio.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 Andrea Ferro
Nono, non sbagli, mi serviva proprio un esempio sull'uso di
std::allocator<T>, che non ho proprio capito come si usa nè a cosa serva :)
GraSsie
Bruno

 std::allocator<T>, che non ho proprio capito come si usa nè a cosa serva :)
Non ho un esempio da mandarti ne il tempo per spiegarti la cosa fino in fondo.
Ti consiglio di provare a studiarti la definizione di allocator riportata nel
tuo reference della STL.
Velocemente pero' ti spiego a cosa serve. Serve per poter personalizzare e
dall'esterno il modo in cui un container dell'STL utilizza la memoria. E piu'
precisamente il modo in cui alloca e disalloca spazio per gli oggetti che deve
contenere. I container infatti non chiamano direttamente new e delete ma fanno
chiamate ad una istanza della classe allocator (ed essendo tempalte la classe la
puoi definire tu, purche' rispetti la semantica prevista per allocator).
std::allocator e' solo una implementazione di default (puoi provare a studiarti
questa prendendola dai tuoi headrd come esempio). Ma ci sono troppe possbili
variabili perche' una unica implementazione vada sempre bene. Pertanto se il
meccanismo di allocazione non e' per te rilevante, ignora il problema e la STL
farà comunque qualche cosa di sensato. Se invece nel tuo problema questo aspetto
e' importante devi fornire sempre una implementazione specifica dell'allocator
(anche se e' uguale a quella della STL che usi in quel momento, dato che
cambiando STL, compilatore, piattaforma o semplicemente versione del compiltore,
quella di default potrebbe diventare qualche cosa di diverso.
