Newsgroup: it.comp.lang.c++
Titolo: e dopo new... il nulla :(

Ma come puo' da una semplicissima:
  pnt = new char[i+1]; (i->3)
nascere un errore di "Segmentation fault" ??
(sotto linux...)
tnks!

(sotto linux...)
Una domanda: il puntatore è stato già usato in qualche altra istruzione new?
Se sì, ti sei ricordato di chiamare delete[] ?
Ciao
Domenico Barra

 new? Se sì, ti sei ricordato di chiamare delete[] ?
?
Beh, no, almeno non in quel punto...
La funzione, in realta', e' una cosa del genere:
char *function(/*etc etc*/)
{
  int i = get_my_i(); // ==3 (o cmq, 1<=i<=40~)
  char *pnt;
  /*...*/
  pnt = new char[i+1]; <-- segm fault!
  /*...*/
  return(pnt);
}
Ovvio e'  che quindi alla deallocazione del puntatore ci avrei pensato
piu' tardi...
Cmq, a rigor di cronaca, function() viene chiamata 3 volte prima del
fatidico crash, senza creare alcun problema... (?)
In preda al panico avevo provato anche con malloc(), ma il solo risultato
ottenuto era resistere fino a 10 :PP
Please, non so piu' dove sbattere la testa °_° !!

 
Usa il debugger (gdb), se non l'ha ancora fatto. Prepara una variante
minimale ma compilabile del codice in questione che riproduca lo stesso
problema e postala qui o, meglio, su it.comp.linux.development.
Max

 problema e postala qui o, meglio, su it.comp.linux.development.
Ci provero' ancora insomma :(
Grazie cmq dell'aiuto!

nascere un errore di "Segmentation fault" ??
Non e' new che da segfault, ma la successiva 'istruzione'
-- 
 (o-  | Un OS per domarli, Un OS per trovarli,
 //\  | Un OS per ghermirli e nel buio incatenarli
 V_/_ | Nella terra di Redmond, ove l'ombra cupa scende...
http://pinguin.linuxave.net
            r punto salmaso at inwind punto it

lo fa... e quindi si impianta :( !
Basta che new allochi la memoria e chiami il costruttore. Come lo fa
sono cavoli di chi implementa la libreria.


Please, non so piu' dove sbattere la testa °_° !!
Posta il risultato del debugger



Credo proprio di no: nessun compilatore accetterebbe una roba simile :-)
(oltretutto senza ';' alla fine, ma che significa 'x->3'?)
Ciao
Domenico Barra

 (oltretutto senza ';' alla fine, ma che significa 'x->3'?)
(*x).3 ?
Boh...
Massimo

(sotto linux...)
Il problema e' molto probabilmente che in qualche punto
*PRECEDENTE* hai sconfinato o commesso qualche altro
errore che ha danneggiato la struttura di gestione heap
delle librerie di sistema.
Come ho gia' detto ad altri che ponevano domande simili
non sempre quando si sconfina si ottiene un errore: ad
esempio non e' affatto detto che il codice
    int x[10];
    x[20]=0;
provochi una segnalazione di errore.
In realta' dopo l'esecuzione di istruzioni simili potrebbe
essere successa qualunque cosa (dalla cancellazione di
tutti i tuoi file alla prosecuzione senza nessun problema
del programma)
Una cosa che capita frequentemente e' pero' che vengono
danneggiate le strutture di *altri oggetti* oppure quelle
delle librerie di sistema. Il risultato netto e' che in
altri punti del codice perfettamente valido mostrera'
comportamenti anomali.
Purtroppo quando questo accade e' passato a volte molto
tempo macchina (milioni di istruzioni sono gia' state
eseguite) e quindi diventa difficile ricostruire la causa
del problema.
Se si usano strutture dati complesse basate su puntatori
abbastanza frequente e' un "effetto domino" in cui uno
sconfinamento danneggia altri oggetti che a loro volta
iniziano a sconfinare con una reazione a catena. Quando
una delle istruzioni sconfina ad un punto tale che il
sistema operativo riesce a rendersene conto le strutture
dati in memoria sono ormai molto danneggiate e anche
una analisi post-mortem non aiuta per nulla.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Se sì, ti sei ricordato di chiamare delete[] ?
Il non chiamare delete[] prima di allocare un altra area di memoria
e' qualcosa di perfettamente legale (anche se in molti casi ritenuto
immorale) e non puo' generare un errore di quel tipo.
L'unico problema in quel caso e' infatti che la memoria inizialmente
allocata viene "dimenticata" (sono quelli che si chiamano "memory
leak" e portano ad un esaurimento di tutta la memoria disponibile).


Credo proprio di no: nessun compilatore accetterebbe una roba simile :-)
Dicendo che me ne sono accorto dopo della cavolata che avevo scritto
vale? ^_^


fatidico crash, senza creare alcun problema... (?)
Ciň mi fa pensare che l'errore sta da un altra parte. L'ipotesi piů
probabile é che qualche operazione sbagliata(stile l'assegnazione di
un valore ad un indice di un array inesistente o cose simili) nel tuo
programma mandi fuori fase qualche variabile od oggetto, creando cosi'
una serie di errori a catena.
Il Ghenio
-----------
LOVELY SARA
Dal lunedi'al venerdi'su Italia Uno alle 8:10
Non perdetevelo...
-----------