2016-01-28 1 views
1

sur mon programme OpenGL, je veux nettoyer les mémoires en utilisant la macro 'delete' C++. mais, comme vous le savez, lorsque la fenêtre OpenGL est fermé, il ne donnerait pas le contexte de la fonction « principale », donc même si j'écrire du code comme ceci:Comment nettoyer la mémoire après l'appel de glutMainLoop()?

... 
... 
glutMainLoop(); 
//expected to be called after glutMainLoop() 
delete[] a,b,c; 
... 
... 

supprimer macro ne sera pas appelé. Y a-t-il un moyen élégant de nettoyer mes souvenirs?

+1

Si a, b, c (comme dans le code) sont destinés à être utilisés dans la boucle, ils doivent être alloués et libérés dans la boucle, pas dans la fonction en cours. – prabindh

+0

Cochez [this] (http://stackoverflow.com/questions/2688098/cleaning-up-when-exiting-an-opengl-app) et [this] (http://stackoverflow.com/questions/5033832/what -le-plus-gentil-chemin-à-fermeture-glut) – Dan

Répondre

-1

Les premières choses en C++ delete n'est pas une macro, c'est un opérateur. Deuxièmement, vous ne devriez pas utiliser new et delete, mais utiliser RAII, c'est-à-dire compter sur la portée de votre objet pour qu'ils soient désaffectés. Dès qu'un objet est hors de portée, son destructeur est appelé, ce qui vous permet de libérer et de finaliser. Ceci étant dit, le nettoyage derrière soi à la fin du processus est important surtout à des fins de débogage; Si quelque part dans votre routine de nettoyage vous laissez des choses derrière vous, cela signifie que vous avez un bug dans le code de nettoyage. Toutefois, du point de vue de la désallocation des ressources, il s'agit en fait d'une idée mauvaise de désallouer explicitement les ressources du système d'exploitation: Dans un processus de longue durée, le système d'exploitation échangera tout ce qui n'est pas activement utilisé. Donc, si vous avez un espace d'adressage alloué (par code, données ou autre) mais que vous ne l'utilisez pas, le système d'exploitation décidera de l'écrire dans l'espace d'échange ou (si les ressources ont été mappées depuis le stockage) les pages, de sorte que seulement quand il est consulté son repeuplé à partir du stockage.

Si toutefois votre processus se termine juste, le système d'exploitation peut simplement rejeter toutes les allocations sans second regard et, plus important encore, sans pagination dans le contenu de la mémoire de stockage. Lorsqu'un code de réinitialisation spécifique doit être appelé, cela se produit si nécessaire.

C'est exactement l'état d'esprit dans lequel le GLUT original a été conçu: Terminez simplement le processus une fois que vous avez fini de l'utiliser. Notez que dans un programme GLUT-ish, vous n'allez pas allouer d'objets dans main. Cela se produira soit par une demande interactive de l'utilisateur dans l'un des gestionnaires d'événements en entrée, soit dans les fonctions inactives. Ce sont également les endroits où libérer des instances inutiles.

+0

"Deuxièmement vous ne devriez pas utiliser new et supprimer du tout" aaand instant -1. – Blindy

+1

@Blindy: Bien, mais alors * s'il vous plaît expliquer pourquoi pas *, de sorte que les gens qui lisent votre commentaire ne sont pas laissés perplexe ce que vous vouliez dire. Et sérieusement, il n'y a aucune raison valable d'utiliser directement 'new' ou' delete' dans un programme C++ moderne correctement écrit (sauf si vous écrivez un allocateur de mémoire). Vous voulez un tableau? Utilisez un 'std :: vector'. Vous avez besoin d'une instance à laquelle vous tenez un pointeur? Utilisez 'std :: shared_ptr'. – datenwolf