2012-03-12 3 views
2

est ici le code (pertinent) pour ma pro::surface classe:Empêcher un objet de détruire prématurément

/** Wraps up SDL_Surface* **/ 
class surface 
{ 
    SDL_Surface* _surf; 
public: 
    /** Constructor. 
    ** @param surf an SDL_Surface pointer. 
    **/ 
    surface(SDL_Surface*); 

    /** Overloaded = operator. **/ 
    void operator = (SDL_Surface*); 

    /** calls SDL_FreeSurface(). **/ 
    void free(); 

    /** destructor. Also free()s the internal SDL_Surface. **/ 
    virtual ~surface(); 
} 

Maintenant, le problème est que dans ma fonction main, l'objet lui-même détruit (et appelle donc le destructeur qui dangereusement free() s la surface vidéo SDL!) avant le début du véritable rendu.

int main(int argc, char** argv) 
{ 
    ... 
    // declared here 
    pro::surface screen = SDL_SetVideoMode(320,240,16,SDL_HWSURFACE|SDL_DOUBLEBUF); 

    // event-handling done here, but the Video Surface is already freed! 
    while(!done) { ... } // note that "screen" is not used in this loop. 

    // hence, runtime error here. SDL_Quit() tries to free() the Video Surface again. 
    SDL_Quit(); 
    return 0; 
} 

Ma question est, est-il possible d'arrêter l'instance pro::surface de se détruire avant la fin du programme? La gestion de la mémoire fonctionne manuellement:

/* this works, since I control the destruction of the object */ 
pro::surface* screen = new pro::surface(SDL_SetVideoMode(..)); 

/* it destroys itself only when **I** tell it to! Muhahaha! */ 
delete screen; 

/*^but this solution uses pointer (ewww! I hate pointers) */ 

Mais n'y a-t-il pas un meilleur moyen, sans recourir aux pointeurs? Peut-être un moyen de dire à la pile de ne pas supprimer mon objet pour le moment?

+0

Est-ce que 'pro :: surface'" est à vous "? Je ne connais pas SDL, est-il possible de tenir le 'SDL_Surface' dans un pointeur partagé au lieu d'un pointeur brut? Ou au moins quelque chose avec une sémantique de pointeur partagée? – Chad

Répondre

9

Vous avez violé la Règle des Trois, chienne.

pro::surface screen = SDL_SetVideoMode(320,240,16,SDL_HWSURFACE|SDL_DOUBLEBUF); 

Est égal à

pro::surface screen = pro::surface(SDL_SetVideoMode(320,240,16,SDL_HWSURFACE|SDL_DOUBLEBUF)); 

maintenant à double libre, parce que vous avez enfreint la règle de trois. Donnez donc à votre classe un constructeur/opérateur d'assignation de copie approprié, ou interdisez-les et construisez-le explicitement correctement. Editer: Ceci explique aussi pourquoi votre version de pointeur fonctionne bien, car vous n'invoquez pas de copie.

+0

+1, encore 5 minutes jusqu'à ce que je peux accepter. – ApprenticeHacker

+0

@MooingDuck ..... la censure. – ApprenticeHacker

+0

+1 pour le meilleur rire de la journée –

2

Enveloppez l'écran dans un emballage spécial, qui correspond à SDL_SetVideoMode avec SDL_Quit au lieu de SDL_FreeSurface.

pro::screen screen(320, 240, 16, SDL_HWSURFACE | SDL_DOUBLEBUF); 
// ... 

et corriger votre copie cteur, évidemment.

+0

+1, ça marche aussi. – ApprenticeHacker

Questions connexes