HEAP DANNEGGIATO

di il
6 risposte

HEAP DANNEGGIATO

Buongiorno,
sto debuggando un programma sul visual studio su Windows, in presenza della chiamata alla funzione malloc il debugger mi da una interruzione perchè "heap danneggiato".
Ho provato a controllare che il puntatore da me scelto esistesse e che i parametri dati alla funzione fossero corretti. Non riesco a capire quale sia il problema anche perchè è un errore che non mi esce sempre: ieri mi dava lo stesso errore, poi imporvvisamente per tutta la sera non me lo ha più presentato, e oggi eccolo nuovamente.

Grazie in anticipo.

6 Risposte

  • Re: HEAP DANNEGGIATO

    Senza codice è ovviamente impossibile darti una risposta.
  • Re: HEAP DANNEGGIATO

    Questo e' uno di quei problemi MOOOLTO complicati da identificare, proprio perche' ogni tanto capita ed ogni tanto no.
    il fatto che non capiti NON VUL DIRE CHE NON C'E', ma solo che per una congiunzione astrale di eventi, e l'aiuto del Divino Otelma, miracolosamente il problema non si verifica.

    Ma come saprai, il Divino Otelma non e' proprio affidabile

    Fondamentalmente, quello che sta' succededo e' che hai usato un blocco di memoria CORROTTO: ad esempio lo stai usando ma lo avevi precedentemente deallocato, OPPURE hai scritto PIU' di quello che poteva contenere, oppure, ancora, stai usando un puntatore che non punta all'inizio del blocco allocato.

    QUESTO E' IL FONDAMENTALE MOTIVO PER IL QUALE NON SI DOVREBBE MAI GIOCARE l'ARITMETICA DEI PUNTATORI: si risparmia una linea di codice, o 100 byte, ma si introducono rogne che possono richiedere giorni o settimane per poter essere risolti.

    Ovviare al problema NON E' di facile soluzione, pero' ci sono alcune tecniche che ti aiutano ALMENO a capire dove POTREBBE stare il problema.

    Una tecnica e' la seguente:

    devi usare una TUA "malloc" ed una TUA "free" (ad esempio "mymalloc" e "myfree")

    Nella "mymalloc" chiami la malloc, ma allochi un po' piu' di spazio, IN TESTA ED IN CODA, e nello spazio aggiunto ci scrivi un NUMERO MAGICO, una sequenza di bit CONOSCIUTA, ad esempio "0xCAFECAFE", e la dimensione del blocco allocato.

    Quando chiami la myfree, CONTROLLI CHE IN TESTA ED IN CODA CI SIA ancora il NUMERO MAGICO: se cio' non dovesse accadere, lo segnali sulla console.

    In aggiunta, potresti WRAPPARE, con una funzioncina tipo "myptr" OGNI puntatore che usi, e tale funzioncina controlla che IN TEST ed IN CODA al blocco di memoria, ci sia il solito NUMERO MAGICO.

    In alternativa, ci sono librerie come la "dmalloc" che aiutano: ma non sono miracolose, fanno in modo piu' professionale lo stesso controllo che ti ho appena descritto.

    Non e' difficile da implementare, ma, ovviamente, ci sono diversi dettagli da mettere a punto che richiedono un po' di 'smanettamento'
  • Re: HEAP DANNEGGIATO

    Mah ... su un codice "didattico", dando un'occhiata, salta fuori abbastanza facilmente ...
  • Re: HEAP DANNEGGIATO

    @oregon, ovvio, pero' se @AtenaNike e' abbastanza "smart" potrebbe tentare
  • Re: HEAP DANNEGGIATO

    Grazie per i suggerimenti, proverò!
    Per ora ho scoperto che se il numero di blocchi che voglio allocare è piccolo(<=3) il problema si presenta, se invece è maggiore non i si presenta più.
  • Re: HEAP DANNEGGIATO

    Magari se fai vedere il codice ... altrimenti abbiamo perso tutti tempo ... La questione del numero di blocchi è irrilevante
Devi accedere o registrarti per scrivere nel forum
6 risposte