Newsgroup: it.comp.lang.c++
Titolo: non entra nel catch ???

ecco il codice
    try {
    d_datastorage *el;
    el= copia.lst.getValueToIndex(getCurRow());
    try { delete el; } catch(...) { return false; }
           return true;
    }
    catch(...) {
            return false;
    }
ne ho messo due per sicurezza ma niente scoppia sul delete


Esempi minimali e compilabili, per favore.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg


purtroppo non posso è troppo grande il progetto! però son nella cacca!
non mi era mai successo 

 non mi era mai successo 
Cerca di riprodurre le cose salienti con poche righe... se no si può
fare poco.
E sicuro che l'errore sia scatenato da delete e non da altro?
-- 
RiK0
Non credo negli schemi non vincenti.

 E sicuro che l'errore sia scatenato da delete e non da altro?
Assolutamente si o meglio credo che l'errore sia causato (non scattenato) 
dal un iteratore che sfora  (nessuna eccezione tutto attivato )
infatti commentando quella linea nel catch entra ma cioè non toglie che come 
coportamente è stranissimo...
Il codice dell'iteratore è questo :
template<typename tipoGenerico> tipoGenerico 
clsContainer<tipoGenerico>::getValueToIndex(int index)
{
   it= gen.begin();
   for (long num=0; num<index; num++, it++) ;
   return *it;
}

 [CUT]
Continua a proporsi la necessita' di un codice minimale funzionante. Fai 
una copia del tuo progetto, e continua a rimuovere e modificare cose 
finche' non hai ottenuto il minimo essenziale per avere il medesimo 
errore. Tra l'altro, vedrai che seguendo questo procedimento 
probabilmente scoprirai tu da solo dov'era il problema. In ogni caso non 
puoi aspettarti che qua facciamo del lavoro al posto tuo - il newsgroup 
dovrebbe essere "l'ultima ancora" in caso di errori che non si sanno 
proprio come risolvere, dopo aver onestamente provato a fare tutto il 
possibile da soli.
-- 
Mat/tia Belletti             - Graduate student @ 
cs.unibo.it
ICQ: 33292311                - email: 
mbel...@cs.unibo.it
IRC: RedGlow                 - site(s): 
http://mbellett.web.cs.unibo.it/
Red...@jabber.linux.it/Gaim
 - Linux user 299762 @ machine 213003


- se il delete cancella un puntatore non valido il comportamento è 
indefinito (quindi può *anche* verificarsi un crash). Se il puntatore è 
nullo, allora non fa niente.
- se il delete cancella un puntatore valido e tu sollevi delle eccezioni 
nei distruttori ti stai cercando guai.
Indaga in queste due direzioni.
-- 
"Infilarti le piume in culo non fa di te una gallina!"

Il try/catch intorno a delete non ha senso, perche' delete non lancia
eccezioni. Devi verificare che el sia un puntatore valido o nullo
*prima* di chiamare delete.
Ciao,
Nicola


ma infatti il problema l'ho risolto riordinando per bene il codice, mi
faceva paicere farvi sapere questa
cosa e discuterne un pò su' tutto qua , non sto chiedendo di scrivermi il
codice.

 nei distruttori ti stai cercando guai.
Anche perche' quando uno cerca di fare codice che rispetta l'exception
safety, generalmente assume che nei distruttori di eccezioni non ne siano
lanciate, ragion per cui su una delete si *presume* che non ne vengano
lanciate. Fa parte del contratto.
-- 
[ RiK0                                ]
[ non credo negli schemi non vincenti ]
[ two is an odd prime number          ]


non ho parlato di distruttori :) ,

 non ho parlato di distruttori :)
Io pero` leggo una delete. Il che li fa entrare di botta in gioco.



Quindi continuo a dire che č un comportamento molto strano , per verificare 
che un point sia valido lo fai conttrollando il valore
es:
if (p == 0) //non valido
ma se il puntatore in questione (tornato dall'iteratore) non č zero puņ 
essere non valido cmq...
. 

 che un point sia valido lo fai conttrollando il valore
No. Non c'è alcun controllo che puoi fare sul valore per stabilire se un 
puntatore sia o no valido. Puoi controllare se è nullo, ma tale controllo 
ha senso solo se sai già a priori che il puntatore è valido. (Il puntatore 
nullo *è* un puntatore valido.) In generale dev'essere la logica del 
programma a garantire che sia sempre possibile sapere se un puntatore è 
stato invalidato. Se tale garanzia manca, il programma ha un baco.
Questo per ciò che riguarda la *validità* di un puntatore. Poi, nel tuo 
caso, poiché il puntatore viene passato a 'delete', esso deve soddisfare 
un ulteriore importante requisito: *deve* essere stato restituito da una 
chiamata a 'new'. Se manca tale requisito, il comportamento è indefinito.
Max