shared_ptr ou comment éviter les fuites mémoires en C++ (1/3)

Petit post rapide pour parler d’une découverte que j’ai faite il y a peu :). En me remettant un peu le nez dans le C++ et notamment sur les nouveautés de Visual C++ 2010 (et 2008 avec le Feature Pack) j’ai découvert avec plaisir cette classe : shared_ptr.

En 2 mots, c’est une classe générique chargée d’encapsuler un pointeur et chargée de le supprimer quand il n’est plus utilisé. Donc grâce à cette classe on ne fait plus de “new” ni de “delete”

Par exemple le code ci dessous, j’ai “oublié” de deleter mes pointeurs de Cregion dans le cas d’une exception (cas relativement classique quand on a beaucoup de cause de sortie de code et que l’on ne les prévoit pas tous). Le résultat sur la mémoire est immédiat. (Evidemment pour l’exemple je déclenche une exception dans la méthode DisplayName de la classe Cregion)

int _tmain(int argc, _TCHAR* argv[])
        {
        int retChar = 0;
        for(int i=0;i<99999999;i++)
        {
        Cregion *region = NULL;
        try
        {
        region = new Cregion("PACA");
        region->DisplayName();

        //(... some more code ... )

        if(region!=NULL)
        delete region;
        }
        catch(...)
        {
        cout << "exception " << endl;
        }
        }
        cout << "ok" << endl;
        cin >> retChar;
        return 0;
        }

Voici le “résultat” sur perfmon des octets consommés par mon appli :

image

 

Voici un code qui utilise la classe shared_ptr pour faire la même chose (et donc même exception dans la méthode DisplayName).

Notez l’utilisation de la méthode make_shared qui se charge de créer l’instance de Cregion et me renvoi directement le shared_ptr.

int _tmain(int argc, _TCHAR* argv[])
        {
        int retChar = 0;
        for(int i=0;i<99999999;i++)
        {
        try
        {
        shared_ptr<Cregion> region = make_shared<Cregion>("PACA");
        region->DisplayName();

        //(... some more code ... )

        //pas besoin de delete ici, le shared_ptr s'en charge
        }
        catch(...)
        {
        cout << "exception " << endl;
        }
        }
        cout << "ok" << endl;
        cin >> retChar;
        return 0;
        }

Et voici le graph perfmon pour ce code. La différence est évidente 🙂

image

p.s. : pour utiliser shared_ptr sous Visual Studio 2010, j’ai ajouté un include dans le stdafx : #include <memory>

 

voi aussi shared_ptr ou comment éviter les fuites mémoires en C++ 2/3

et shared_ptr ou comment éviter les fuites mémoires en C++ 3/3

Tagués avec :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Verifions que vous êtes un humain * Time limit is exhausted. Please reload CAPTCHA.