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 non eseguito
Forum - C/C++ - Distruttore non eseguito

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Ho un oggetto e devo salvare un file alla sua distruzione, ho scritto un distruttore:
  HighScoreClass::~HighScoreClass() { ... }
Dove salvo il  file, il codice per il salvataggio del file è funzionante perchè mettendolo in una funzione e invocandola il codice viene eseguito.
Ho poi pensato di eliminare esplicitamente l'oggetto con:
  delete HighScore;
Ma il risultato non cambiava, ho notato in oltre che il codice del distruttore in modalità Relase (Visual C++) non veniva nemmeno linkato nell'eseguibile in quanto mettendo un break point mi avvisava che non c'era quella parte di codice eseguibile nel programma.

Non sapendo come fare ho cercato su google e ho trovato:
  http://msdn.microsoft.com/it-it/library/ms177197.aspx
Penso di aver capito il meccanismo, ho provato a sostituire la tilde con "!" ma il compilatore mi ha avvisato che il mio programma veniva compilato con un flag per usare la semantica normale dei distruttori.

Non so cosa fare, se c'è qualcuno che mi può aiutare grazie :)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:57
Sabato, 13/10/2012
Strano... puoi mostrarci il codice?


Il mio blog: https://piero.dev
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:14
Lunedì, 15/10/2012
Certo:

Codice sorgente - presumibilmente C#

  1. // HighScore.cpp / .h
  2.  
  3. extern Scene *HighScore;
  4.  
  5. class HighScoreClass: public Scene {
  6. public:
  7.         HighScoreClass();
  8.         void draw_front();
  9.         void input(ALLEGRO_EVENT event);
  10.         ~HighScoreClass();
  11. };
  12.  
  13. HighScoreClass::~HighScoreClass() {
  14.         FILE *fh = fopen("HS.dat", "wb"); // MAI compilato
  15.         if(fh) {
  16.                 fwrite(fh, HScore, sizeof(struct HighPos) * NScores);
  17.                 fclose(fh);
  18.         }
  19.         // [...] Rilascio risorse
  20. }
  21.  
  22. // Scene.cpp / .h
  23.  
  24. void initScenes();
  25. void finalizeScenes();
  26.  
  27. void initScenes() {
  28.         Global = new GlobalClass();
  29.         Menu = new MenuClass();
  30.         HighScore = new HighScoreClass();
  31.         Game = new GameClass();
  32. }
  33.  
  34. void finalizeScenes() {
  35.         delete Global;
  36.         delete Menu;
  37.         delete HighScore; // Compilato SOLO in Debug
  38.         delete Game;
  39. }
  40.  
  41. // main.cpp
  42.  
  43. void fin(void) {
  44.         if(cScene) cScene->fin();
  45.         Global->fin();
  46.         // General Finalize
  47.         finalizeScenes();
  48.         // [...] Rilascio risorse Globali
  49. }
  50.  
  51. int main(int argc, char* argv[]) {
  52.         init();
  53.         game_loop();
  54.         fin();
  55. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:48
Lunedì, 15/10/2012
Il distruttore non e' virtuale... e siccome dichiari la variabile HighScore di tipo Scene, solo il distruttore di Scene viene chiamato. Assicurati di dichiarare il distruttore in Scene virtuale.

Codice sorgente - presumibilmente Delphi

  1. class Scene{
  2.     virtual ~Scene();
  3. }
  4.  
  5. Class HighScoreClass : public Scene{
  6.     virtual ~HighScoreClass();
  7. }


Ultima modifica effettuata da pierotofy il 15/10/2012 alle 15:49


Il mio blog: https://piero.dev
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:20
Lunedì, 15/10/2012
Non me n'ero accorto, grazie, a dire il vero in Scene non c'era neanche un distruttore :_doubt: dunque essendo un puntatore a Scene non poteva sapere che ce ne fosse uno ;)

PM Quote