PDA

Visualizza la versione completa : [C++] Memory leak


enigmagame83
08-12-2008, 19:12
Ciao,
ho un dubbio riguardante i memory leak, supponiamo io abbia la seguente classe:
a.h


class A
{
public:
A();
~A();
};

a.cpp


#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.

oregon
08-12-2008, 19:13
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 ...

enigmagame83
08-12-2008, 19:20
Scusami, mi sono scordato, ora l'ho messo.
Ad esempio il main potrebbe essere cosi:


#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.

oregon
08-12-2008, 19:23
Prima della exit devi liberare la memoria ...

enigmagame83
08-12-2008, 19:26
Originariamente inviato da oregon
Prima della exit devi liberare la memoria ...
Ok, supponiamo di modificarlo in questo modo:


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...

oregon
08-12-2008, 19:29
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.

daniele_dll
08-12-2008, 19:30
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

enigmagame83
08-12-2008, 21:11
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:


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.

oregon
08-12-2008, 22:03
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).

Loading