Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Distruttore di classe
Forum - C/C++ - Distruttore di classe

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
2018_GPCPP (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/01/2018

Segnala al moderatore
Postato alle 15:23
Giovedì, 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++

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. class prova{
  6.       public:
  7.       int no;
  8.       public:
  9.       prova(){no=4;};
  10.       ~prova(){};
  11.       };
  12. class clase{
  13.       public:
  14.       int valore;
  15.       prova * op;
  16.      
  17.       public:
  18.              clase(){op = new prova[1]; valore = 1000; cout<<"classe ok"<<endl;};
  19.              ~clase(){valore = 500; cout<<"classe terminata"<<endl;};
  20.      
  21.      
  22.      
  23.       };
  24.  
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28.     string prosegui;
  29.     clase * pt;
  30.     pt = new clase[1];
  31.     cout<<pt[0].valore<<endl;
  32.     cout<<pt[0].op->no<<endl;
  33.    
  34.  
  35.     delete[] pt;
  36.    
  37.     cout<<pt[0].valore<<endl;
  38.     cout<<pt[0].op->no<<endl;
  39.  
  40.    
  41.     system("PAUSE");
  42.     return EXIT_SUCCESS;
  43. }



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?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:28
Giovedì, 04/01/2018
op e' allocato dinamicamente con l'operatore new.

Dovresti deallocarlo nel distruttore:

Codice sorgente - presumibilmente Plain Text

  1. ~clase(){valore = 500; delete[] op; cout<<"classe terminata"<<endl;};



Il mio blog: https://piero.dev
PM Quote
Avatar
2018_GPCPP (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/01/2018

Segnala al moderatore
Postato alle 17:15
Giovedì, 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.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:25
Giovedì, 04/01/2018
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.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:25
Giovedì, 04/01/2018
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à.
PM Quote
Avatar
2018_GPCPP (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/01/2018

Segnala al moderatore
Postato alle 20:54
Giovedì, 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

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:53
Giovedì, 04/01/2018
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.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 1:57
Venerdì, 05/01/2018
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à.
PM Quote
Avatar
2018_GPCPP (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/01/2018

Segnala al moderatore
Postato alle 9:40
Venerdì, 05/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.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo