Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C++] Memory leak

  1. #1

    [C++] Memory leak

    Ciao,
    ho un dubbio riguardante i memory leak, supponiamo io abbia la seguente classe:
    a.h
    codice:
    class A
    {
    public:
    	A();
    	~A();
    };
    a.cpp
    codice:
    #include "a.h"
    
    A::A()
    {
    }
    
    A::~A()
    {
    }
    Ora consideriamo la mia funzione main.cpp dove alloco un nuovo oggetto A ed esco dal programma. Mi viene trovato un memory leak, scusate ma come lo evito?
    Grazie.
    Enigma

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Anche se ti sembra scontato, devi indicare sempre il linguaggio nel titolo (regolamento).

    In ogni caso, se allochi qualcosa, prima di terminare il programma, lo deallochi.

    Se mostri il main, e' meglio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Scusami, mi sono scordato, ora l'ho messo.
    Ad esempio il main potrebbe essere cosi:
    codice:
    #include <GL/glut.h>
    #include "a.h"
    
    void  keyboard( GLubyte, GLint, GLint );
    void rendering(void);
    
    A* a;
    
    int main(int argc, char* argv[])
    {
    	glutInit(&argc, argv);
    	glutInitWindowPosition(0, 0);
    
    	glutInitWindowSize(1024, 1024);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
    	glutCreateWindow("");
    
    	a = new A();
    
    	glutKeyboardFunc(keyboard);
    	glutDisplayFunc(rendering);
    	glutMainLoop();
    }
    
    void  keyboard( GLubyte key, GLint x , GLint y)
    {
    	if(key == 27)
    	{
    		exit(1);
    	}
    }
    
    void rendering(void)
    {
    	a.some();
    }
    Quando la dovrei liberare? Cioè è questo che non capisco. Quanto premo ESC si esce dal programma come si vede dal codice. Ma anche se lo metto prima dell'istruzione exit() ottengo sempre un memory leak.
    Grazie.
    Enigma

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima della exit devi liberare la memoria ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Prima della exit devi liberare la memoria ...
    Ok, supponiamo di modificarlo in questo modo:
    codice:
    void  keyboard( GLubyte key, GLint x , GLint y)
    {
    	if(key == 27)
    	{
                    delete a;
    		exit(1);
    	}
    }
    Al debug ottengo sempre un memory leak, è quello che non capisco, perchè continua a trovarmelo...
    Enigma

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quale messaggio in dettaglio ?

    Se non esci tramite l'exit, allora la

    delete a;

    va inserita anche dopo la

    glutMainLoop();

    prima della fine del main.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    enigma, non dovresti terminare l'applicativo cosi brutalmente, considerando che hai le glut inizializzate.

    Dentro la gestione del tasto esc (char => 27) dovresti lanciare la funzione
    glutLeaveMainLoop

    che serve esattamente a terminare il loop principale delle glut

    poi dopo puoi disallocare la roba delle glut e eliminare la a
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    Errore mio, effettuavo il controllo in un punto sbagliato.
    Grazie per il consiglio sulla glutLeaveMainLoop, ora la utilizzerò.
    Ho un altra domanda, supponiamo una funzione di questo tipo:
    codice:
    Vector3D* operator * (const float val, const Vector3D &vector)
    {
    	Vector3D *ris = new Vector3D();
    
    	ris->x = vector.x * val;
    	ris->y = vector.y * val;
    	ris->z = vector.z * val;
    
    	return(ris);
    }
    In questo caso, come posso deallocare ris? Visto che lo devo ritornare.
    Grazie.
    Enigma

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da enigmagame83
    Errore mio, effettuavo il controllo in un punto sbagliato.
    Cioe' ? Solo per capire ...

    In questo caso, come posso deallocare ris? Visto che lo devo ritornare.
    Tutto cio' che allochi va deallocato quando non serve piu'.
    In questo caso, sara' deallocato dal codice che ha chiamato la funzione dopo che ha utilizzato l'oggetto ... (deallocato dal chiamante).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.