Newsgroup: it.comp.lang.c++
Titolo: Problemi con l'allocazione di memoria

Ho scritto un programmino che legge delle frame (video) da un file di
ingresso le processa in un certo modo trascrivendole su di una classe
(bitstring) creata da me e poi spedisce il risultato su una socket.
La classe non è altro che una stringa alla quale ho aggiunto la 
possibilità di scrivere anche un singolo bit:
class bitstring {
    unsigned char   byte_buffer;
    int             num_bit;
    int             num_byte;
    int  	    bit_offset;
  public:
    int DIM;
    unsigned char * stringa;
    bitstring(int);
    ~bitstring();
    ....
};
Questi sono costruttore e distruttore
bitstring:: bitstring (int dim)
{
 stringa = new (unsigned char[dim]);
 nyte_buffer=0;
 num_bit=0;
 num_byte=0;
 bit_offset=0;
 DIM=dim;
}
bitstring::~bitstring ()
{
  delete [] stringa;
}
Finita la lunga premessa arrivo al punto, il programma di cui parlavo
sopra chiama ripetutatemente una funzione la cui struttura è la
seguente:
void estrai (int dim,...)
{
 bitstring out_string(dim)   //dim può assumere i valori 360 e 1440
 ...
}
per quanto ne so all'uscita di questa funzione l'oggetto out_string
dovrebbe essere eliminato con il distruttore, però accade che dopo un
paio di volte che la funzione è stata chiamata il programma riceve un
SIGABORT,e per la precisione ho potuto constatare (con DDD) che questo
avviene nella prima riga del costruttore (quella con il new) e questo
mi ha fatto pensare ai problemi di memoria. Infatti tralaltro questo
errore lo ricevo solo sul computer di casa (64M di ram) e non con 
quello del lavoro (256M di ram) dove il programma gira correttamente.
Dove sbaglio ? cosa posso fare per risolvere il problema?
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

Dove sbaglio ? cosa posso fare per risolvere il problema?
Hmm, scusate in effetti questo post era diretto a i.c.o.l.d. , mi sono
confuso, cmq penso che tralasciando la parte finale possa essere it
anche qui.


 }
Distruggi esattamente una istanza della classe bitstring o una
istanza di una classe che deriva da bitstring ?
Se cosi' fosse ricorda di fare il distruttore virtuale.
Poi per il resto non ci ho visto nulla di strano, hai provato
qualche cosa tipo Purify ?
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 quello del lavoro (256M di ram) dove il programma gira correttamente.
Non trovo nulla di sbagliato nella parte che hai postato e nel ragionamento che
hai fatto. La mia sensazione e' che ci sia da qualche parte una scrittura
out-of-bound relativa a memoria allocata dinamicamente (forse la stringa, forse
no). Oppure una scrittura ad un indirizzo che era stato liberato con free.
Verifica bene il codice. Al limite posta integralmente la classe bitstring e la
funzione estrai.
--
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

qualche cosa tipo Purify ?
Cos'è purify?


funzione estrai.
Ti ringrazio lo stesso :)



Un tool della rational che ti trappa gli errori quali out-of-bound
o se allochi della memoria che poi non rilasci etc etc
Ciao
Gaetano.


 cioč scrivevo oltre il limite ^__^;;


 cioè scrivevo oltre il limite ^__^;;
Cosa c'e' di incredibile? Il fatto che "indovinassi" cosa facevi anche senza
aver visto il codice? E' solo questione di esperienza. Ti andava in fault dopo
poche chiamate, quindi difficilmente era un out of memory. Inoltre un sistema
operativo con memoria virtuale ce ne mette parecchio prima di darti out of
memory allocando pochi byte (o anche pochi kilobyte) per volta. E poi parlavi di
una eccezione di sistema e non una eccezione del C++ (anche se uncatched). La
maggior parte delle implementazioni (se sono corrette) hanno una throw nel new
per questo caso e una catch speciale all'esterno del main che scrive qualche
cosa come "uncatched exception in ..." e poi termina il processo correttamente.
E quelle scorrette ritornano null dal new, e te ne saresti accorto nel debugger.
Infine l'errore era in una new, che e' parte della libreria. In che casi la
funzione new puo' generare una eccezione di sistema (escluso il caso che ci sia
un bug nella new o nella delete, caso che devi considerare solo se stai
deuggando un nuovo compilatore)? Risposta: quando va a scrivere a casaccio in
memoria. E dato che non prende nessun input puo' scrivere a casaccio in memoria
solo se le sue strutture dati interne (che usa per tenere le liste dei blocchi
allocati e dei blocchi liberi) sono inconsistenti. Tali strutture sono accedute
(legalmente) solo da new e da delete. E si trovano FISICAMENTE subito prima
degli indirizzi tornati da new e subito dopo la fine dei blocchi di memoria che
allochi. Ovvero si trovano agli indirizzi che corrispondono ad un out of bound
(positivo o negativo) sulla memoria allocata dinamicamente.
In altre parole, cosi' come ogni volta che vedi un misterioso errore di
compilazione sulla prima dichiarazione di un file ci sono buone probabilità che
manchi un ; o una } alla fine dell'ultimo header che hai incluso, ogni volta che
trovi una eccezione misteriosa eseguendo una allocazione (new, alloc, calloc,
malloc non importa) o una deallocazione (free, delete o che altro) c'e' una
buona probabilità che il problema sia una scrittura out-of-bound su memoria
allocata dinamicamente oppure una scrittura su memoria già deallocata.
Nulla di misterioso.


aver visto il codice? E' solo questione di esperienza.
Non e' vero Nemesis.  A mia nonna ha diagnosticato un'ulcera
duodenale, senza neanche conoscerla.
-- 
Andrea Laforgia - walkietalkie(at)
libero.it

Nulla di misterioso.
Ottimo Watson, insomma grazie č stata una lettura interessante :)


duodenale, senza neanche conoscerla.
e l'aveva veramente ? :)
