2018_GPCPP (Normal User)
Newbie
Messaggi: 8
Iscritto: 04/01/2018
|
Buongiorno a tutti,
sto cercando di capire/studiare come gestire la memoria in un programma scritto in C++.
Nel liberare la memoria allocata da un oggetto utilizzando il distruttore di classe tramite istruzione delete mi sorgono diversi dubbi.
esempio:
Codice sorgente - presumibilmente C++ |
#include <cstdlib> #include <iostream> using namespace std; class prova{ public: int no; public: prova(){no=4;}; ~prova(){}; }; class clase{ public: int valore; prova * op; public: clase(){op = new prova[1]; valore = 1000; cout<<"classe ok"<<endl;}; ~clase(){valore = 500; cout<<"classe terminata"<<endl;}; }; int main(int argc, char *argv[]) { string prosegui; clase * pt; pt = new clase[1]; cout<<pt[0].valore<<endl; cout<<pt[0].op->no<<endl; delete[] pt; cout<<pt[0].valore<<endl; cout<<pt[0].op->no<<endl; system("PAUSE"); return EXIT_SUCCESS; }
|
Nel caso precedente non capisco perchè dopo la distruzione dell'oggetto pt mi ritrovo che effettivamente pt[0].valore non ha più il valore assegnato dal costruttore mentre pt[0].op->no rimane invariato...
per distruggere l'oggetto op presente all'interno dell'oggetto pt devo fare il delete di op perchè non basta il delete su pt?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
op e' allocato dinamicamente con l'operatore new.
Dovresti deallocarlo nel distruttore:
Codice sorgente - presumibilmente Plain Text |
~clase(){valore = 500; delete[] op; cout<<"classe terminata"<<endl;};
|
|
|
2018_GPCPP (Normal User)
Newbie
Messaggi: 8
Iscritto: 04/01/2018
|
Ti ringrazio della tempestiva risposta, effettivamente è così non mi spiego perchè distruggendo l'oggetto principale a cascata non si distruggano anche gli oggetti membri di quell'oggetto bensì bisogna richiamare il loro distruttore... ma quest'ultima è più una critica... ma probabilmente vedendolo da un punto di vista più a basso livello sicuramente ci saranno delle ragioni.
|
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
Se tu avessi all'interno di "clase" un oggetto "prova", allora succederebbe proprio quello che dici.
Invece tu hai prova*, e un puntatore non necessariamente potrebbe essere allocato al momento della distruzione, oppure potrebbe essere condiviso e quindi liberarlo automaticamente sarebbe un errore.
Quindi se usi new, gestire la memoria sta a te. Poi delete[] chiama anche il distruttore dell'oggetto.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
Non viene distrutto proprio perché allocato dinamicamente.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
2018_GPCPP (Normal User)
Newbie
Messaggi: 8
Iscritto: 04/01/2018
|
Chiaro ora penso d'aver capito; un suggerimento conoscete un buon programma per sistema operativo windows per analizzare la memoria di un programma in esecuzione?
Perchè lavoro con code::blocks il dubug fornito non mi piace e mi piacerebbe effettuare dei test, sto provando cheat engine ma non è il massimo...
grazie
|
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Questa è effettivamente una bella domanda! A suo tempo, col System 7 della Apple, usavo un attrezzino che si chiamava ZoneRanger che era d'una utilità impressionante. C'è però da dire che a quei tempi il sistema operativo funzionava in modo MOLTO diverso dai Windows attuali, per cui non so in che misura potrebbe avere ancora senso, oggi, un attrezzo del genere.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
Che c'entra cheat engine con un debugger?
Che devi fare esattamente?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
2018_GPCPP (Normal User)
Newbie
Messaggi: 8
Iscritto: 04/01/2018
|
Trovo interessante analizzare il flusso di dati che passa per una variabile; per semplicità uso cheat engine perchè una volta agganciato l'indirizzo di memoria della variabile mi aggiorna in automatico il valore decimale che passa nella stessa.
Purtroppo con il debug su code::blocks mi trovo maluccio, in pratica mi servirebbe un programma per analizzare la memoria in maniera precisa magari con restituzione del valore, GDB debugger su unix se non ricordo male funzionava bene.
|
|