Newsgroup: it.comp.lang.c++
Titolo: STL list segmentation fault

Salve,
dopo aver utilizzato innumerevoli volte liste e vettori di STL mi trovo 
ad avere un semplice pezzo di codice che fa uso di liste di strutture
invece che di oggetti, tale codice segmenta istantaneamente solo
se tento di estrarre un iterator o chiamare un qualsiasi metodo della
lista, il tutto e' strutturato circa come segue:
typedef struct {
	...
} Image;
typedef struct {
	...
	Image **a;
} Texture;
list<Texture *> lista;
appena tento minimamente di accedervi :
list<Texture *>::const_iterator i = lista.begin();
oppure
if(lista.empty()) { ... }
ottengo un segmentation fault, ecco l'output di gdb :
0x000000000043f77e in std::list<Texture*, std::allocator<Texture*> >::begin (
    this=0x0) at stl_list.h:580
580           { return this->_M_impl._M_node._M_next; }
Mi chiedevo se qualcuno avesse esperienza in merito e sapesse darmi un
consiglio...
saluti,
Andrea

Allochi con new i Texture che ci infili dentro, vero?
Ciao,
Nicola

Si esatto, ma il problema e' che crasha ben prima di inserirci qualcosa,
appena chiamo una empty() o qualsiasi altro metodo segmenta...
ciao

 darmi un consiglio...
Bisogna vedere più. Seguendo gdb, hai chiamato begin su un
puntatore nul. Cosa che non è possibile si la lista è una
variabile locale. (Ho già visto che gdb si sbaglia così. Mà solo
con delle versioni vecchie ;  se ti servi d'una versione
ricente, deve funzionnare.)
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

 appena chiamo una empty() o qualsiasi altro metodo segmenta...
Come direbbe il marchese di La Palisse se non e' li', evidentemente il
problema e' altrove. Buona caccia!
Ciao,
Nicola

 
Con così pochi elementi è dura da capire !
Una classe per essere un elemento di una list<> deve rispondere a 3 
requisiti :
1- copiabile da un costruttore di copia :
	Texture(const Texture &);
2- assegnabile tramite operatore :
	const Texture & operator=(const Texture &);
3- distruttibile da distruttore :
	virtual ~Texture() throw();
Se non dichiarati, il compilatore li crea di default.
Nel tuo caso, con puntatori ad aree di memoria allocate via operator 
new, sarebbe cosa buona e giusta definirli.
Se per caso non lo avessi già fatto prova a definirli tu stesso, 
implementando il comportamento corretto (ed atteso).
Altra cosa che mi viene in mente guardando l'errore è che tu stia 
utilizzando qualcosa del genere :
list<Texture *> *lista = NULL;
list<Texture *>::iterator it = lista->begin();
lista->size();
Ma non ho, o a me non bastano, per capire con sicurezza l'errore.
Ciao,
Giulio

 Ciao,
grazie comunque delle informazioni a cui non ero a conoscenza, ciao !
Andrea

 posso definirvi dei metodi (oppure in qualche modo si?), 
nello stesso identico modo in cui le dichiari per una class
L'unica differenza tra struct e class è che la prima ha tutti i 
membri e routine pubbliche per default, l'altra tutto privato 
per default (nonché alcuni significati specifici della parola 
chiave class, tipo nei template e forse, ma solo forse, 
distinzioni nelle conversioni di tipo nei diversi livelli di 
ereditarietà : quest'ultimo dubbio però è solo dovuto a 
ignoranza mia che non ho mai provato a costruire struct derivate 
da altre)
per il resto non commento siccome non conosco le List standard
ciao
Soviet
