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.