smalldragon ha scritto:
@jj2007
ho provato la funzione ma mi da lo stesso risultato di quello che avevo scritto io, problema non risolto.
il problema è che io so già che il puntatore e valido ma non so fino a quando lo è.
esempio
mi alloco una stringa di 5 byte
passo il puntatore ad una routine che scrive in questa variabile ma che può gestire altre variabili più grandi.
quando vado a rilasciare la variabile,quella di 5 byte, giustamente mi da un errore di heap corruption.
adesso io vorrei che il programma mi restituisse l'errore non in fase di rilascio della memoria
ma in fase di scrittura cosi da poter intervenire subito e correggere l'errore.
senza dovermi portare sempre a presso la dimensione della variabile o dovermela calcolare ogni volta.
hai qualche consiglio da darmi?
A parte il fatto che e' gia' stato detto, ti sono gia' stati forniti i link di libri che spiegano come si fa, ma laciamo perdere.
Ti crei un ALLOCATORE CUSTOM
Quando allochi un blocco di memoria, aggiungi in testa ed in coda le seuenti informazioni (quidni devi allocare PIU' SPAZIO di quello richiesto):
1) testa: la dimensione del blocco di memoria allocato e un MAGIC_NUMBER_HEAD
2) coda: una funzione della dimensione e del MAGIC_NUMBER_HEAD (MAGIC_NUMBER_TAIL)
3) ritorni il puntatore NON all'area allocata (che contiene le informazioni 1) e 2) ) MA all'area disponibile per l'applicazione
4) OGNI VOLTA che accedi al puntatore, PRIMA di usarlo ricostruisci il puntatore originale e valuti la presenza di MAGIC_NUMBER_HEAD e MAGIC_NUMBER_TAIL
5) se e' tutto a posto, il puntatore e' valido, ALTRIMENTI il puntatore e' corrotto
6) quando rilasci il blocco di memoria, azzerri il blocco e magari al posto dei MAGIC_NUMBER_XXX ci metti un nuovo MAGIC_NUMBER_DELETED, in quest modo, se tenti di usare il puntatore e trovi MAGIC_NUMBER_DELETED sai che il blocco e' stato cancellato, se trovi valori strani, stai usanso un puntatore che non sta' puntando a niente di precedentemente allocato
Questo NON RISOLVE TOTALMENTE il prolema dei puntatori non validi o della possibilita' di scriver AL DI FUORI dell'area allocata perche' potrebbe sempre capitare di usare un puntatore che sta' puntando ad un'area di memoria rilasciata e poi riallocata da un'altra parte del programma per tutti altri motivi, OPPURE che sei andato a scrivere AL DI FUORI dell'area di memoria ESATTAMENTE i byte corrispondeti al MAGIC_NUMBER_TAIL
MA, se i valori sono stati selezionati con cura, dovrebbe essere abbastanza difficile trovarsi nei casi sudetti.
Questo funziona SOLO con lo heap, NON con le variabili globali o quelle allocate sullo stack!