Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Errore di runtime dovuto a new e delete

    Ciao ragazzi, sto inceppando in un errore in runtime
    ve lo spiego meglio che posso.

    ho scritto un'applicazione di circa 500 righe con visual studio 2010 in c++
    in questa applicazione alloca memoria in modo dinamico per dei puntatori a TCHAR in questo modo:

    codice:
    TCHAR * szMyString;
    szMyString = new TCHAR [100];
    /*uso la mia stringa*/
    delete [] szMyString;
    Fin qui tutto ok

    poi nell'applicazione quando il ritorno di certe funzioni causava valori falsi ho deciso di fare comparire un MessageBox() e di terminare l'applicazione....in questo modo però quasi sempre quando riavviavo l'exe mi dava un errore di runtime, più in specifico mi diceva che la memoria heap era gestita male.

    Dopo un lungo pensare e debuggare sono arrivato alla conclusione (ESATTA ) che quando trovavo un eccezzione dovevo fare "delete [] szBlaBlaBla" per ripristinare la memoria

    Fin qui si direbbe tutto ok

    PERO' se per disgrazia l'applicazione va in CRASH, e ciò non si può evitare completamente perchè può accadere, se rieseguo l'exe mi va in crash per heap malgestito !!!!

    l'unico modo è riavviare il pc così la memoria si resetta!!!!

    Come posso fare?????? aiuto vi prego!!!
    i programmi come firefox o altro se vanno in crush continuano il loro funzionamento senza problemi!!!!

  2. #2
    Se il tuo programma va in crash il suo processo viene terminato, tutta la memoria allocata viene rilasciata e gli heap creati vengono distrutti, così come tutti gli handle aperti, di conseguenza non è possibile che tra un avvio di un processo e l'altro persistano problemi di questo genere. Probabilmente il problema è un altro, posta il codice.

    P.S.: onde evitare memory leak ti consiglio vivamente di evitare l'uso di delete espliciti, utilizzando invece gli smart pointers.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mmm

    cosa sono gli smart pointers...? comunque per il codice posterò 1 pezzo alla volta perchè è troppo lungo....

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Meglio ancora dimenticare le stringhe C e usare quelle C++.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Concordo pienamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mmmm

    preferisco una gestione senza l'utilizzo della classe string.....perfavore spiegatemi come potrei impiegare gli smart pointers

  7. #7

    Re: mmmm

    Originariamente inviato da kirakira93
    preferisco una gestione senza l'utilizzo della classe string....
    Fidati che invece preferirai una gestione con l'utilizzo della classe string entro qualche settimana...
    perfavore spiegatemi come potrei impiegare gli smart pointers
    Leggiti l'introduzione agli smart pointers di boost, se poi hai ancora dubbi non esitare a chiedere. Nel tuo caso credo che lo smart pointer giusto possa essere boost::scoped_array.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ok

    ragazzi.....ho fatto due ragionamenti...(e mi ci sono voluti 2 giorni per arrivarci!):

    ok mettiamo che la gestione delle stringhe così TCHAR * szBla si deprecata ed è meglio passare a string o smart pointers.....PERO' se io devo fare un array di oggetty di una classe servendomi dell'allocazione dinamica sono sempre allo stesso punto!!!
    se per disgrazia (e non è raro ) mi dovesse crushare prima che io abbia utilizzato il delete...ecco che sono fregato.... e l'heap va a farsi benedire....!

    Perchè??? forse perchè io faccio un nuovo new quando devo ancora fare un delete......e allora esiste un modo per azzarare la memoria all'avvio del programma con funzione preventiva? o adottare uno stratagemma tipo

    codice:
    class animale /*bla bla bla*/
    animale * cane;
    
    if(cane != NULL) //o una cosa del genere.... per cui chiedo ausilio
        delete [] cane;
    
    cane = new animale [10];
    che ne dite....può servire a qualcosa...?
    forse è meglio un free() che un delete perchè così non chiama il costruttore......

    AIUTO!


    => Aspirante programmatore sconvolto dopo la scoperta che new e delete non sono portabili!

  9. #9

    Re: ok

    Originariamente inviato da kirakira93
    ok mettiamo che la gestione delle stringhe così TCHAR * szBla si deprecata ed è meglio passare a string o smart pointers.....PERO' se io devo fare un array di oggetty di una classe servendomi dell'allocazione dinamica sono sempre allo stesso punto!!!
    No. In primo luogo, se ti serve un array di oggetti in genere è meglio usare std::vector, e comunque puoi sempre creare array con new e usare gli smart pointer per la deallocazione.
    se per disgrazia (e non è raro ) mi dovesse crushare
    Crashare... to have a crush significa avere una cotta per qualcuno.
    prima che io abbia utilizzato il delete...ecco che sono fregato.... e l'heap va a farsi benedire....!
    Già ti ho spiegato che in caso di crash il processo viene terminato, e con la terminazione del processo i vari heap da esso creato vengono distrutti. Il sistema operativo in caso di crash libera automaticamente tutte le risorse che il processo deteneva, chiudendone in automatico tutti gli handle.
    Perchè??? forse perchè io faccio un nuovo new quando devo ancora fare un delete......e allora esiste un modo per azzarare la memoria all'avvio del programma con funzione preventiva?
    Non esiste perché non serve.
    o adottare uno stratagemma tipo

    codice:
    class animale /*bla bla bla*/
    animale * cane;
    
    if(cane != NULL) //o una cosa del genere.... per cui chiedo ausilio
        delete [] cane;
    cane = new animale [10];
    che ne dite....può servire a qualcosa...?
    Non ha nessun senso, per il semplice fatto che all'avvio del nuovo processo la variabile cane non avrà alcuna relazione con quella dell'istanza precedente del programma (e tra l'altro il codice che hai scritto in un programma normale farebbe danni, visto che se la variabile cane è allocata sullo stack il suo contenuto è indefinito).
    forse è meglio un free() che un delete perchè così non chiama il costruttore......
    Mai, mai, MAI mischiare diversi allocatori/deallocatori. Rischi di fare solo danni. Ribadisco, il tuo problema non c'entra niente con tutto questo, per il semplice fatto che, come già ripetuto diverse volte, nuovo processo=nuovo heap, terminazione del processo=distruzione automatica dell'heap, rilascio automatico delle risorse.
    => Aspirante programmatore sconvolto dopo la scoperta che new e delete non sono portabili!
    Che c'entra la portabilità adesso? new e delete sono portabili, sono standard C++...
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10

    Re: ok

    Come ti ha già accennato MItaly:
    - malloc/realloc implicano free (controllare SEMPRE che il valore restituito da malloc/realloc non sia NULL);
    - new implica delete;
    - new [] implica delete [];
    se non lo fai produrrai inevitabilmente comportamenti indefiniti (tra cui, un'improbabile vincita alla lotteria, e molto probabili disastri)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.