Stringhe in memoria dinamica

di il
44 risposte

44 Risposte - Pagina 3

  • Re: Stringhe in memoria dinamica

    oregon ha scritto:


    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.
    Allora, calmiamoci e ragioniamo. La frase "Allochi 3 caratteri e ne scrivi 8 ... chissà dove finiscono gli altri 5" l'ho interpretata secondo il significato che i caratteri non venissero allocati in byte adiacenti, e non mi sembra un'interpretazione fuori dal mondo. Magari tu volevi intendere che vengono sì allocati in maniera adiacente, ma possono essere messi in indirizzi non riservati al sistema. Ok, però scusa se mi permetto, ma la si poteva scrivere meglio. Forse c'è una cosa che veramente non ho capito: i caratteri, essendo allocati dinamicamente, non possono "uscire fuori" dall'heap in ogni caso? Nel senso che la memoria libera non viene allocata sul momento a tempo di esecuzione?
  • Re: Stringhe in memoria dinamica

    Ti è stato spiegato in maniera esemplare!
    Se tu allochi 3 blocchi e ne scrivi 8 (naruralmente adiacenti e per capire il perché forse è il caso studiarsi i vettori e come funziona la memoria e gli indirizzi) dove vanno a scriversi quei 5 byte extra?
    Possono finire ovunque e quindi puoi finire per modificare cose che non dovresti, capire il dove finirai a scrivere è assai complesso ed inutile da trattare su di un forum.
    L'unica cosa che è realmente utile per il tuo livello di conoscenze è sapere che
    Ad ogni new corrisponde un delete
    Punto,.
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    La frase "Allochi 3 caratteri e ne scrivi 8 ... chissà dove finiscono gli altri 5" l'ho interpretata secondo il significato che i caratteri non venissero allocati in byte adiacenti
    Questo tuo ragionamento è un "salto logico" e comunque diverso da "locazioni a caso".
    In ogni caso, come dici tu, non potevi chiedere "ma quindi vuol dire che non risultano adiacenti?" prima di sparare che si dicono falsità?
    Non credi che potevi "dirlo meglio" e magari anche scusarti per la fesseria che hai detto?

    E - in ogni caso - quando qualcosa non ti torna, evita di sparare sentenze senza fondamento e chiedi chiarimenti.
    Forse c'è una cosa che veramente non ho capito: i caratteri, essendo allocati dinamicamente, non possono "uscire fuori" dall'heap in ogni caso? Nel senso che la memoria libera non viene allocata sul momento a tempo di esecuzione?
    Dillo meglio perché non si capisce cosa intendi.

    Fra l'altro mi sembra che questo thread, nato con la new e la delete, passato per i memory leak e finito al buffer overflow, sia già diventato troppo caotico ... le regole del forum impongono un argomento per thread altrimenti diventa una chat.
  • Re: Stringhe in memoria dinamica

    vbextreme ha scritto:


    Ti è stato spiegato in maniera esemplare!
    Se tu allochi 3 blocchi e ne scrivi 8 (naruralmente adiacenti e per capire il perché forse è il caso studiarsi i vettori e come funziona la memoria e gli indirizzi) dove vanno a scriversi quei 5 byte extra?
    Possono finire ovunque e quindi puoi finire per modificare cose che non dovresti, capire il dove finirai a scrivere è assai complesso ed inutile da trattare su di un forum.
    L'unica cosa che è realmente utile per il tuo livello di conoscenze è sapere che
    Ad ogni new corrisponde un delete
    Punto,.
    E' questo che non capisco! Se ad un certo punto scrivo quegli 8 byte (3 allocati e 5 extra) e li scrivo subito dopo l'allocazione (cioè fra char* s = new char[3]; e cin >> s; non c'è nessun'altra istruzione) come faccio a sovrascrivere qualcosa? Non voglio una spiegazione approfondita, ma solo un'idea di come sia possibile sovrascrivere qualcosa in questa maniera. Mi viene in mente questo: potrei per esempio sovrascrivere un elemento di una lista, i cui elementi non sono scritti consecutivamente ma sono messi dove c'è spazio. Mi basta una spiegazione intuitiva, niente di approfondito o troppo complesso. Sempre se è possibile ovviamente, cioè se la spiegazione non richieda conoscenze troppo approfondite.
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    E' questo che non capisco! Se ad un certo punto scrivo quegli 8 byte (3 allocati e 5 extra) e li scrivo subito dopo l'allocazione (cioè fra char* s = new char[3]; e cin >> s; non c'è nessun'altra istruzione) come faccio a sovrascrivere qualcosa?
    Con la cin quando inserisci i dati oltre la zona allocata, scrivi su quello che c'è e che non è tuo.

    Che non ci sia nulla tra la new e la cin non importa assolutamente nulla.

    Ripeto ... in una zona di memoria di cui non si sa nulla, in cui potrebbe non esserci nulla come potrebbe esserci roba importante per il processo. Dove addirittura potresti non essere autorizzato a scrivere o che potrebbe non esistere (come indirizzi virtuali allocati per il processo).
  • Re: Stringhe in memoria dinamica

    oregon ha scritto:


    Autodidatta ha scritto:


    La frase "Allochi 3 caratteri e ne scrivi 8 ... chissà dove finiscono gli altri 5" l'ho interpretata secondo il significato che i caratteri non venissero allocati in byte adiacenti
    Questo tuo ragionamento è un "salto logico" e comunque diverso da "locazioni a caso".
    In ogni caso, come dici tu, non potevi chiedere "ma quindi vuol dire che non risultano adiacenti?" prima di sparare che si dicono falsità?
    Non credi che potevi "dirlo meglio" e magari anche scusarti per la fesseria che hai detto?

    E - in ogni caso - quando qualcosa non ti torna, evita di sparare sentenze senza fondamento e chiedi chiarimenti.
    Forse c'è una cosa che veramente non ho capito: i caratteri, essendo allocati dinamicamente, non possono "uscire fuori" dall'heap in ogni caso? Nel senso che la memoria libera non viene allocata sul momento a tempo di esecuzione?
    Dillo meglio perché non si capisce cosa intendi.

    Fra l'altro mi sembra che questo thread, nato con la new e la delete, passato per i memory leak e finito al buffer overflow, sia già diventato troppo caotico ... le regole del forum impongono un argomento per thread altrimenti diventa una chat.
    Ma io mi posso pure scusare, e mi scuso, però non puoi dire che il mio sia un salto logico. "Chissà dove" significa che non si sa dove, invece si sa dove, quello che non si sa è se là sovrascrivo qualcosa o succede qualcos'altro, ma il dove si sa benissimo. Adesso sembra che voglia insistere su questa cosa, e non è così, è solo che vedo che sei un po' permaloso, e quindi lo divento pure io. Mi scuso per aver detto che dici falsità, però pure tu potresti ammettere che non ti sei spiegato bene.
    Per quanto riguarda l'argomento, non mi sembra di essere andato OT, dato che sono tutti aspetti riguardanti certi errori che si possono commettere con le stringhe.
  • Re: Stringhe in memoria dinamica

    oregon ha scritto:


    Autodidatta ha scritto:


    E' questo che non capisco! Se ad un certo punto scrivo quegli 8 byte (3 allocati e 5 extra) e li scrivo subito dopo l'allocazione (cioè fra char* s = new char[3]; e cin >> s; non c'è nessun'altra istruzione) come faccio a sovrascrivere qualcosa?
    Con la cin quando inserisci i dati oltre la zona allocata, scrivi su quello che c'è e che non è tuo.

    Che non ci sia nulla tra la new e la cin non importa assolutamente nulla.

    Ripeto ... in una zona di memoria di cui non si sa nulla, in cui potrebbe non esserci nulla come potrebbe esserci roba importante per il processo. Dove addirittura potresti non essere autorizzato a scrivere o che potrebbe non esistere (come indirizzi virtuali allocati per il processo).
    Ok, grazie mille! Ti sei spiegato benissimo!
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    Ma io mi posso pure scusare, e mi scuso, però non puoi dire che il mio sia un salto logico. "Chissà dove" significa che non si sa dove
    Ma non significa "locazioni a caso", questo è il salto logico. E non sono falsità, altro salto ...
    il dove si sa benissimo
    Questo lo pensi tu, invece ti confermo che non si sa perchè la zona in cui vai a scrivere potrebbe essere proprio "chissà dove" inteso come area assegnata a tutt'altro scopo.
    sei un po' permaloso
    In realtà, allora, ti dirò che sei tu ad essere un po' arrogante, impreciso e maleducato.
    Prova a dire "grazie per la spiegazione ma non capisco questo, mi puoi spiegare meglio" al posto di "dite falsità" e vedi che divento meno permaloso.
    Per quanto riguarda l'argomento, non mi sembra di essere andato OT, dato che sono tutti aspetti riguardanti certi errori che si possono commettere con le stringhe.
    Se parli delle stringhe allora questo thread non si chiuderà mai. Ti confermo che sei OT:
  • Re: Stringhe in memoria dinamica

    Allora!!! prendi tre bicchieri, prova adesso a rienpirne otto!!!!!!Dove finisce tutta la grappa in più? bho dipende ma se tu non allochi gli otto contenitori che servirebbero di certo finirà dove non deve.
  • Re: Stringhe in memoria dinamica

    Autodidatta ha scritto:


    Sì è vero, meglio evitare questa cosa quando alloco con new. Però non ho capito una cosa: cambiando il valore del puntatore, perché devo comunque fare la delete? Se faccio una cosa del genere (anche se non va fatta), delete non causa un malfunzionamento (faccio delete su un puntatore che punta a qualcosa che non sta in memoria libera)?
    Scusa, ma ti stai intestardendo su un argomento complesso, anche se non cosi' complesso, facendo una serie di elucubrazioni non basate sulla conoscenza e sullo studio, ma solo sul sentito dire.

    L'allocazione della memoria in un programma e' una delle operazioni FONDAMENTALI, senza la quale l'unica cosa che un computer potrebbe fare e' eseguire le 4 operazioni.

    Ed infatti, di tecniche per l'allocazione della memoria ne sono state inventate a bizzeffe:

    - struct
    - vettori
    - puntatori
    - smart pointer
    - reference counting
    - garbage collector
    - allocatori
    - ecc

    Ogni sistema ha i suoi pregi ed i suoi difetti.

    Il tuo modo di ragionare sembra derivare da un linguaggio di programmazione che prevede l'uso del Garbage Collector (C#, Java, PHP, Perl, Python, ...), dove il sistema si occupa, quando puo', di realllocare lo spazio necessario per mantenere, in modo corretto le informazioni che vengono gestite. Quindi, quando questo spazio di memoria non serve piu', e' il GC che si occupa di ricuperarlo.

    In C++, NON C'E' NESSUN GC. La memoria deve essere allocata con estrema oculatezza e rilasciata con estrema attenzione.
    E' TOTALMENTE SBAGLIATO pasticciare con i puntatori, e soprattutto pasticciare con spazi di memoria allocati in modo diverso.

    Ma e' peggio di cosi': in C++ ci sono almeno TRE tipologie di memoria (ma ce ne possono essere MOOLTE di piu'), e corrispondentemente TRE modi diversi di fare delle allocazioni:

    - costanti
    - stack
    - heap

    Usare un tipo di allocazione e poi usare un diverso tipo di deallocazione e' FONTE DI CRASH dell'applicazione (se sei fortunato), oltre ad essere TOTALMENTE SBAGLIATO.

    Anche se funziona , lo fa solo per quello che tecnicamente si chiama culo/fortuna/caso. NON E' ASSOLUTAMENTE ASSICURATO che continui a funzionare cambiando compilatore, versione del compilatore, sistema operativo, hardware, ecc. O semplicemente cambiando una riga qualunque del codice in un posto qualunque.

    Un'altro problema e' la questione di che cosa succede se allochi spazio per X oggetti e in quell'area di memoria ne vuoi scrivere Y > X: e' una cosa ESTREMAMEMNTE GRAVE perche' quello che stai facendo e' andare a scrivere in un'area di memoria gestita dal gestore di memoria.

    Compito del gestore di memoria e', appunto, quello di trovare la memoria quantita' di memoria che hai chiesto di allocare, e poi gestirla quando la rilasci. Per fare questo ha la necessita' di mantenere delle strutture dati di servizio.

    Se hai culo/fortuna potresti non fare danni, se invece sei sfortunato vai a corrompere queste strutture dati, incasinando alquanto il gestore di memoria, che a questo punto potrebbe fare qualunque cosa.

    Ed e' proprio questi giochetti che gli hacker usano per prendere il controllo dei PC!!!


    Un esempio che potrebbe aiutarti e' il seguente: se vuoi cambiare la CPU del tuo PC, devi usare un ben specifico modo per estrarla, selezionarne un'altra con i piedini compatibili, e reinserirla in un ben specifico modo.

    Se usi una CPU sbagliata, o la rimuovi non nel modo corretto, o la inserisci in modo sbagliato, potrebbe, per un colpo di fortuna, anche funzionare, ma nessuno ti puo' assicurare che possa continuare a funzionare all'infinito.
  • Re: Stringhe in memoria dinamica

    @migliorabile ha scritto:


    culo/fortuna/caso.
    sei il mio nuovo idolo
  • Re: Stringhe in memoria dinamica

    C'è la facciamo a restare sull'argomento e non divagare?
    Per l'autore: se vuoi introdurre un nuovo argomento crea una nuova discussione.

    Tutto chiaro?
  • Re: Stringhe in memoria dinamica

    State parlando di me????????
    aahhahahahahhah
    ma dopo 3 pagine di "ad ogni new corisponde un delete" tiri le orecchie a me?
    la discussione originaria era terminata già alla prima risposta di @migliorabile, tutto il resto è stata pura ripetizione.

    Magari le mie divagazioni speravano in una chiusura del thread obbligando colui che l'aveva aperto a creare un nuovo thread sui suoi nuovi dubbi?
    O semplicemente la mia distillereia clandestina ha riaperto i battenti?
  • Re: Stringhe in memoria dinamica

    Toki ha scritto:


    C'è la facciamo a restare sull'argomento e non divagare?
    Per l'autore: se vuoi introdurre un nuovo argomento crea una nuova discussione.

    Tutto chiaro?
    Chiarissimo. Ringrazio tutti per le complete spiegazioni.
  • Re: Stringhe in memoria dinamica

    Bene. Game Over
Devi accedere o registrarti per scrivere nel forum
44 risposte