Stringhe in memoria dinamica

di il
44 risposte

44 Risposte - Pagina 2

  • Re: Stringhe in memoria dinamica

    oregon ha scritto:


    Forse non ci capiamo ...

    Devi fare la delete per la new che hai fatto ... Il valore del puntatore che usi per la new e la delete deve essere il medesimo. Se cambi puntatore, ti ho detto, causi un problema di memory leak.

    Per una assegnazione di un puntatore come

    char *p = "ciao";

    non va fatta la delete perché non c'è la new ...
    Sì questo l'avevo capito. La mia domanda era una domanda inutile in caso di buona programmazione, ma comunque sensata perché posso fare:

    char* s = new char;
    s = "Paperino";

    senza che il compilatore mi dia errore (che io sappia il memory leak non è un errore, è solo cattiva programmazione). In questo caso faccio la new ma non devo fare la delete, perché il valore del puntatore cambia.
  • Re: Stringhe in memoria dinamica

    Ma parti da un presupposto sbagliato ... Il memory leak è un errore grave in un programma e non puoi certo dire che la regola new/delete non vale se la basi su un memory leak ...!

    1) new di un puntatore .... delete dello stesso puntatore .... OK

    2) assegnazione di un puntatore a costante ... nessuna new ... nessun delete ... OK

    3) tutti gli altri modi SBAGLIATI di usare puntatori ... NO OK ... non ha senso parlare di regole ...
  • Re: Stringhe in memoria dinamica

    Il memory leak di per se non e' grave, ma SOLO SE CONTROLLATO E CONOSCIUTO.

    Ma questa situazione e' MOOOOOLTO specifica, ne senso che ci sono pochissime situazioni in cui puo' essere tollerato.

    Ad esempio, un'applicazione parte, alloca in memoria una struttura dati molto complessa, fa quello che deve fare, e termina. In questo SPECIFICO caso, il memory leak potrebbe anche essere tollerato, perche' fondamentalmente, rilasciare la memoria, per poi terminare, e' un'operazione che puo' essere tralasciata, tanto lo fa direttamente il SO.

    In generale, invece, i memory leak SONO FONTE DI ROGNE rognose, la principale delle quali e' il crash dell'applicazione per OUT OF MEMORY: cioe' l'applicazione ha allocato tutta la memoria disponibile e non e' in grado di continuare.

    Trovare il problema, in queste situazione e', letteralmente, un bagno di sangue perche' spesso l'applicazione non schianta dicendo OUT OF MEMORY, ma per tutti altri strani motivi. Proprio la presenza di questi strani motivi e' un segnale del memory leak.

    Naturalmente, quando l'applicazione schianta.

    Perche' potrebbe fare anche di peggio, come, ad esempio, congelare la macchina, non rendendola piu' accessibile. E se la macchina e' remota ed amministrata via terminale (situazione normale nei centri di calcol, nelle banche, eccc), questo vuol dire chiamare un sistemista che deve prendere l'automobile e spostarsi dall'azienda alla palazzina in cui si trova la sala macchine, per fermare e riavvirare la macchina manualmente.

    Questo, per applicazioni che devono funzionare senza interruzione 24/24 e 7/7, evidentemente non e' accettabile. Anche perche' il memory leak potrebbe rendere l'applicazione inutilizzabile nell'arco di pochi minuti (il che sarebbe pure una situazione ottima, perche' semplificherebbe il debugging), oppure, mooolto peggio, dopo ore o giorni. Ed in questo caso, identificare dove si trova il problema, potrebbe essere decisamente complicato.
  • Re: Stringhe in memoria dinamica

    Grazie dell'esauriente spiegazione!
    Un'altra domanda: esiste un sistema che permetta di prendere una stringa da tastiera e contemporaneamente assegnarla ad un array di caratteri in memoria dinamica? Da quanto ho capito bisogna prima definire la dimensione dell'array e poi metterci dentro i caratteri da cin. Mi piacerebbe sapere se è possibile invece fare le due cose contemporaneamente: prendo la stringa e la metto nell'array, il quale sarà dimensionato secondo la lunghezza della stringa.
    Grazie
  • Re: Stringhe in memoria dinamica

    Std::string
    http://en.cppreference.com/w/cpp/strin
  • Re: Stringhe in memoria dinamica

    shodan ha scritto:


    std::string
    http://en.cppreference.com/w/cpp/strin
    No intendevo senza usare la classe string, una stringa come array di caratteri terminata col carattere nullo.
  • Re: Stringhe in memoria dinamica

    Allora no, non esiste niente del genere. Devi prima dimensionare l'array per riempirlo (e stare attento a non uscire dai limiti fissati dalla dimensione).
  • Re: Stringhe in memoria dinamica

    shodan ha scritto:


    Allora no, non esiste niente del genere. Devi prima dimensionare l'array per riempirlo (e stare attento a non uscire dai limiti fissati dalla dimensione).
    Ah ok. Faccio questa osservazione, perché non capisco dove sia la falla: se faccio:

    int n = 3;
    char* s = new char[n];
    cin >> s;

    ma da tastiera metto una stringa di 8 caratteri, cosa c'è di sbagliato? Ho verificato che funziona, e non dovrei andare a sovrascrivere niente, in quanto l'array puntato da s viene creato a tempo di esecuzione, quindi in memoria dinamica non dovrebbe esserci un oggetto contiguo che viene sovrascritto. Dov'è l'errore?
  • Re: Stringhe in memoria dinamica

    Che vuoi dire?

    Allochi 3 caratteri e ne scrivi 8 ... chissà dove finiscono gli altri 5, magari in indirizzi non riservati al sistema e non comprendi dove sta l'errore? Non puoi scrivere in memoria caratteri senza avere allocato in precedenza la memoria, è una regola che ancora non hai "digerito" ... proponi questo tipo di errore in tanti tuoi thread ...
  • Re: Stringhe in memoria dinamica

    La "potenza" del c/c++ sta anche nel lasciare libero il programmatore.
    Se questo ne aumenta le prestazioni dall altro canto ne limita la sicurezza.
    Quindi si il c/c++ ti lascia il libero arbitrio, sta a te scegliere la strada.
    Le motivazioni sono spesso complesse e criptiche e non penso sia adesso/questo il momento di parlarne.
  • Re: Stringhe in memoria dinamica

    oregon ha scritto:


    Che vuoi dire?

    Allochi 3 caratteri e ne scrivi 8 ... chissà dove finiscono gli altri 5, magari in indirizzi non riservati al sistema e non comprendi dove sta l'errore? Non puoi scrivere in memoria caratteri senza avere allocato in precedenza la memoria, è una regola che ancora non hai "digerito" ... proponi questo tipo di errore in tanti tuoi thread ...
    Scusa ma mi sembra che tu la faccia un po' troppo semplice: se definisco:

    char* s = new char[3];

    e poi da standard input prendo una stringa di otto caratteri e faccio:

    cin >> s;

    viene messo come carattere finale il carattere nullo '\0'. Quindi esiste un criterio, i caratteri non vengono messi a caso da qualche parte, e non può essere una coincidenza che nelle mie prove vengano memorizzati sempre consecutivamente in memoria, proprio per il fatto che la stringa è riconosciuta come tale, altrimenti non verrebbe messo come ultimo carattere il carattere di fine stringa. Accetto i suggerimenti e ringrazio chi me li fornisce, ma bisogna pure approfondire gli argomenti...
  • Re: Stringhe in memoria dinamica

    Non c'è niente da approfondire.
    Quello che stai facendo ha un nome preciso: buffer overflow!

    http://it.wikipedia.org/wiki/Buffer_overflo
    http://www.siforge.org/articles/2003/04/15-bofexp.htm

    ossia il superamento dei limiti dell'array. E quando succede può accadere di tutto: che si abbia l'illusione che tutto funzioni, che il programma vada kaputt, che il programma vada bene per un po' e poi abbia problemi misteriosi etc.
    Insomma è undefined beaviour.
  • Re: Stringhe in memoria dinamica

    shodan ha scritto:


    Non c'è niente da approfondire.
    Quello che stai facendo ha un nome preciso: buffer overflow!

    http://it.wikipedia.org/wiki/Buffer_overflo
    http://www.siforge.org/articles/2003/04/15-bofexp.htm

    ossia il superamento dei limiti dell'array. E quando succede può accadere di tutto: che si abbia l'illusione che tutto funzioni, che il programma vada kaputt, che il programma vada bene per un po' e poi abbia problemi misteriosi etc.
    Insomma è undefined beaviour.
    E ci voleva tanto a dirlo? C'è da approfondire perché la risposta non è stata questa, è stata un'altra. E la risposta era sbagliata, perché quello che inserisco viene riconosciuto come stringa, non vengono messi caratteri in locazioni a caso. Stai confermando che c'era da approfondire, infatti adesso approfondirò il buffer overflow, ma non mi è stato detto prima, prima mi sono state dette cose false.
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    E la risposta era sbagliata, perché quello che inserisco viene riconosciuto come stringa, non vengono messi caratteri in locazioni a caso.
    Le locazioni in memoria sono adiacenti, per questo i caratteri appaiono sequenziali e non in "locazioni a caso" anche se si sfora la dimensione dell'array, ma questo si da per scontato dato che è scritto in tutti i libri.
    Stai confermando che c'era da approfondire
    Non sto confermando nulla. Ho detto solo come si chiama il tuo errore e del perché lo devi evitare.
    prima mi sono state dette cose false.
    Quando avrai capito i puntatori vedrai che sono corrette.
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    E ci voleva tanto a dirlo? C'è da approfondire perché la risposta non è stata questa, è stata un'altra. E la risposta era sbagliata, perché quello che inserisco viene riconosciuto come stringa, non vengono messi caratteri in locazioni a caso. Stai confermando che c'era da approfondire, infatti adesso approfondirò il buffer overflow, ma non mi è stato detto prima, prima mi sono state dette cose false.
    Quando ti dico che i caratteri che inserisci "vanno a finire magari in indirizzi non riservati al sistema" è esattamente quello che può succedere, non è affatto falso e se non lo capisci non è un mio problema. Nessuno ha mai detto "locazioni a caso", te lo sei inventato tu.

    Il fatto che tu volessi sapere che in questo modo si può creare una situazione di "buffer overflow" è solo un dettaglio che potevi ottenere da solo facendo una semplice ricerca su internet, da vero autodidatta, e non fornisce NULLA di più al discorso.

    Il fatto reale è che, non solo tu non sai quello che dici, ma che i tuoi interventi stanno diventando veramente irritanti.

    Non ti permettere più di dire che ti si dicono cose false, se non le capisci è un'altra storia.
Devi accedere o registrarti per scrivere nel forum
44 risposte