begin process at 2012 05 27 17:49:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > POINTEUR INTELLIGENT

POINTEUR INTELLIGENT


 Information sur la source

Note :
2 / 10 - par 1 personne
2,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Trucs & Astuces Classé sous :Pointeur, Intelligent, Template Niveau :Débutant Date de création :26/07/2010 Date de mise à jour :29/07/2010 15:08:50 Vu / téléchargé :2 633 / 99

Auteur : DrMckey

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

Bonjour à tous.

Voici une classe permettant de gérer un pointeur un peu plus intelligemment, afin d'éviter une fuite mémoire en oubliant un "delete".
Ceci est mon premier code source partagé. Alors je suis preneur de toutes remarques sur la manière de commenter le code ou sur le code lui-même.
D'avance merci :)

Source

  • // ======================================================================= //
  • // Fichier: Pointer.h //
  • // Description: Template permettant d'éviter une fuite mémoire //
  • // Création: 25 juillet 2010 //
  • // Version: 1.0.0.1 //
  • // ======================================================================= //
  • #ifndef POINTEUR_H
  • #define POINTEUR_H
  • // ======================================================================= //
  • // Fichiers include //
  • // ======================================================================= //
  • #include <cstddef>
  • // ======================================================================= //
  • // Template Pointeur : Template pour gèrer un pointeur sur un objet //
  • // ======================================================================= //
  • template <class C> class Pointeur
  • {
  • private:
  • void* operator new (size_t) { return 0; }
  • void operator delete (void *) { }
  • public:
  • /* Constructeurs et destructeur */
  • Pointeur () : _pData (0) { }
  • Pointeur (C src) : _pData (new C (src)) { }
  • Pointeur (C *src) : _pData (src) { }
  • Pointeur (Pointeur<C> &src) : _pData (src._pData) { src._pData = 0; }
  • ~Pointeur () { delete _pData; }
  • void operator ~()
  • {
  • delete _pData;
  • _pData = 0;
  • }
  • /* Définition des opérateurs d'affectation */
  • C* operator = (C* src)
  • {
  • delete _pData;
  • _pData = src;
  • return _pData;
  • }
  • C* operator = (C src)
  • {
  • /* Vérification de l'existence d'un pointeur afin d'éviter de faire une
  • suppression et une création à chaque modification de valeur. */
  • if (!_pData)
  • _pData = new C ();
  • *_pData = src;
  • return _pData;
  • }
  • C* operator = (Pointeur<C>& src)
  • {
  • delete _pData;
  • _pData = src._pData;
  • src._pData = 0;
  • return _pData;
  • }
  • /* Fonction permettant de vérifier si le pointeur est null */
  • bool DataIsNull () const { return _pData == 0; }
  • /* Définition des opérateurs de comparaison */
  • bool operator != (C *src) const { return *_pData != *src; }
  • bool operator == (C *src) const { return !operator == (src); }
  • bool operator != (C src) const { return *_pData != src; }
  • bool operator == (C src) const { return !operator == (src); }
  • bool operator == (Pointeur<C>& src) const
  • {
  • return _pData == src._pData || (_pData && src._pData && *_pData == *src._pData);
  • }
  • bool operator != (Pointeur<C>& src) const
  • {
  • return !operator == (src);
  • }
  • /* Définition des opérateurs de lecture */
  • operator const C* () const {return _pData;}
  • operator const C& () const {return *_pData;}
  • operator C* () const {return _pData;}
  • operator C& () const {return *_pData;}
  • C& operator * () const {return *_pData;}
  • protected:
  • /* Pointeur sur la donnée */
  • C *_pData;
  • };
  • #endif /* POINTEUR_H */
// ======================================================================= //
// Fichier:     Pointer.h                                                  //
// Description: Template permettant d'éviter une fuite mémoire             //
// Création:    25 juillet 2010                                            //
// Version:     1.0.0.1                                                    //
// ======================================================================= //

#ifndef POINTEUR_H
#define POINTEUR_H

// ======================================================================= //
// Fichiers include                                                        //
// ======================================================================= //
#include <cstddef>


// ======================================================================= //
// Template Pointeur : Template pour gèrer un pointeur sur un objet        //
// ======================================================================= //
template <class C> class Pointeur
{
private:
   void* operator new (size_t) { return 0; }
   void  operator delete (void *) { }

public:
   /* Constructeurs et destructeur */
   Pointeur () : _pData (0) { }
   Pointeur (C src)  : _pData (new C (src)) { }
   Pointeur (C *src) : _pData (src) { }
   Pointeur (Pointeur<C> &src) : _pData (src._pData) { src._pData = 0; }
  ~Pointeur () { delete _pData; }
   void operator  ~()
      {
      delete _pData;
      _pData = 0;
      }

   /* Définition des opérateurs d'affectation */
   C* operator = (C* src)
      {
      delete _pData;
      _pData = src;
      return _pData;
      }
   C* operator = (C src)
      {
      /* Vérification de l'existence d'un pointeur afin d'éviter de faire une 
         suppression et une création à chaque modification de valeur. */
      if (!_pData)
         _pData = new C ();
      *_pData = src;
      return _pData;
      }
   C* operator = (Pointeur<C>& src)
      {
      delete _pData;
      _pData = src._pData;
      src._pData = 0;
      return _pData;
      }

   /* Fonction permettant de vérifier si le pointeur est null */
   bool DataIsNull () const { return _pData == 0; }

   /* Définition des opérateurs de comparaison */
   bool operator != (C *src) const { return *_pData != *src; }
   bool operator == (C *src) const { return !operator == (src); }
   bool operator != (C src)  const { return *_pData != src; }
   bool operator == (C src)  const { return !operator == (src); }
   bool operator == (Pointeur<C>& src)  const
      {
      return _pData == src._pData || (_pData && src._pData && *_pData == *src._pData);
      }

   bool operator != (Pointeur<C>& src)  const
      {
      return !operator == (src);
      }

   /* Définition des opérateurs de lecture */
   operator const C* () const {return  _pData;}
   operator const C& () const {return *_pData;}
   operator C* ()       const {return  _pData;}
   operator C& ()       const {return *_pData;}
   C& operator * ()     const {return *_pData;}

protected:
   /* Pointeur sur la donnée */
   C  *_pData;
};

#endif /* POINTEUR_H */

 Conclusion

Exemple d'utilisation:
-----------------------
#include <stdio.h>
#include <string.h>
#include "pointer.h"

int main(int argc, char* argv[])
{
   Pointeur<int> var1;      /* Création d'un pointeur null */
   Pointeur<int> var2 (14); /* Création d'un pointeur avec la valeur 14 */
   Pointeur<int> var3;

   /* Assignation de la valeur 15. */
   /* Comme le pointeur est null, un nouveau pointeur est créé automatiquement. */
   var3 = 15;

   /* Comparaison des valeurs de deux pointeurs */
   /* Si différents, On transfert l'adresse du pointeur var3 dans var1; */
   if (var3 != var2)
      var1 = var3;

   /* Vérification si le pointeur est null */
   /* et assignation d'une nouvelle valeur à un pointeur existant */
   if (var3.DataIsNull ())
      var3 = *var2 + *var1;

   return 0;
}

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 juillet 2010 15:08:52 :
Version 1.0.0.1: Modification et simplification du code de la classe suivant les commentaires postés

 Sources de la même categorie

Source avec Zip Source avec une capture OPTIONS PENDANT LE DÉBOGAGE par avictatum
Source avec Zip Source avec une capture Source .NET (Dotnet) TROUVER UN CONTROLE "ACTIF" DANS UN FORM par didierdeco91
Source avec Zip Source avec une capture RESISTANCES ÉQUIVALENTES par besqueut
Source avec Zip Source avec une capture Source .NET (Dotnet) JACALENDAR par raffika
Source avec Zip Source .NET (Dotnet) EXPORTER LES IMAGES DE WORD ET D' EXCEL par Le Pivert

 Sources en rapport avec celle ci

UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip TEMPLATES C/C++ POUR VS 2010 par BruNews
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
SMART POINTEUR À COMPTEUR DE RÉFÉRENCE par nirgal76
POINTEUR INTELLIGENT par snpier wolf

Commentaires et avis

Commentaire de CptPingu le 27/07/2010 11:57:31 administrateur CS

Quelques remarques:
* Pas besoin de stdio.h ou string.h, seul cstddef est nécessaire pour "l'opérateur new"
* Quand tu as une méthode == et une méthode !=, ne fait pas de copier coller. Ecrit l'une des deux, et inverse la condition pour l'autre.
* delete 0 n'est pas une erreur. Ça ne fera rien.  Donc inutile de faire un test avant, tu peux directement faire un "delete truc" en toute sécurité.
* Différencie un attribut de classe d'une variable normale. Par convention, on met souvent un "_" devant.
* Initialise un maximum d'élément à l'aide la liste d'initialisation dans un constructeur.
* Quand tu as un "return", inutile de faire un "else". Le return est débranchant et quittera la fonction.
* Je t'ai simplifié quelques expressions.

Sinon, je n'ai pas constaté de fuite mémoire ou de bug.

#ifndef POINTER_HH_
# define POINTER_HH_

#include <cstddef>

template <class C>
class Pointeur
{
private:
  void* operator new (size_t) { return 0; }
  void operator delete (void*) { }

public:
  Pointeur()
    : _pData(0)
  {
  }

  Pointeur(C src)
    : _pData(new C(src))
  {
  }

  Pointeur(C* src)
    : _pData(src)
  {
  }

  Pointeur(Pointeur<C>& src)
    : _pData(src._pData)
  {
    src._pData = 0;
  }

  ~Pointeur ()
  {
    delete _pData;
  }

  C* operator=(C* src)
  {
    delete _pData;
    _pData = src;
    return _pData;
  }

  C* operator=(C src)
  {
    delete _pData;
    _pData = new C(src);
    return _pData;
  }

  C* operator=(Pointeur<C>& src)
  {
    delete _pData;
    _pData = src._pData;
    src._pData = 0;
    return _pData;
  }

  bool dataIsNull() const
  {
    return _pData == 0;
  }

  bool operator!=(C* src) const { return *_pData != *src; }
  bool operator==(C* src) const { return !operator==(src); }
  bool operator!=(C src) const { return *_pData != src; }
  bool operator==(C src) const { return  !operator==(src); }

  bool operator==(Pointeur<C>& src) const
  {
    return _pData == src._pData ||
      (_pData && src._pData && *_pData == *src._pData);
  }

  bool operator!=(Pointeur<C>& src) const
  {
    return !operator==(src);
  }

  operator const C*() const {return _pData;}
  operator const C&() const {return *_pData;}
  operator C*() const {return _pData;}
  operator C&() const {return *_pData;}
  C& operator*() const {return *_pData;}

protected:
  C* _pData;
};

#endif /* !POINTER_HH_ */

Commentaire de DrMckey le 28/07/2010 00:06:21

Salut!
Un grand merci pour ces remarques, j'en prends bonne note.
Je vais retravailler mes sources avec toutes ses infos.
Encore merci :)

Commentaire de vecchio56 le 28/07/2010 21:07:07 administrateur CS

Quel intérêt d'utiliser un Pointeur<T> plutot qu'un T directement?
En général j'utilise new/delete (T* donc) car l'objet n'est pas libéré à la sortie de la méthode, mais avec un Pointeur<T> je perd ce comportement.

Commentaire de Ilsundal le 27/08/2010 11:02:21 2/10

Salut a toi,

pour commencer, on ne code pas dans les .h si tu veux faire ça, utilise des .hpp. Sinon bien peu d'interet. (PS : enleve vlc.h il sert a rien)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

les template [ par FlyFucker ] Bonjour,peut on se servir d'un struct en temps que type d'un template !car avec le template que j'ai fait, au moment de l'integration dans mon program pointeur de fonction [ par Larwin ] salut tout le mondebon j'suis un gros débutant c/c++ et je fais mes premiers pas depuis 2, 3 jours...j'ai deja un petit probleme :)je m'explique :j'ai Pointeur sur fonction envoyé par dll [ par MoDDiB ] Voila ce que j'ai fais mais ca ne marche pas :Dll :#include &lt;windows.h&gt;BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpR Pointeur et liberation de memoire [ par Darkneon ] Salut, J'avais un probleme apres que je liberais de la memoire allouer a un pointeur, le message "Null pointer assignment" m'apparaisait toujours. Le appeler un tableau... [ par ilimo ] bonjour,voici mon probleme :1- j'ai 3 classes : a, b, c2- classe "a" contient un tableau de pointeur sur pointeur de classe "b" : b **tab;3- j'initial Les pointeurs sont-ils si avantageux côté performance ? [ par ZackyBambou ] ZackrBambou Voici je débute en c++ puisque je cherchais un langange pouvant optimiser la rapidité de mes programme par la mémoire et les calcul au cpu pointeurs [ par djkill55 ] bonjour,j aimerai savoir cmt on fait un scanf sur une suite de pointeur, je m explike, je dois faire ca ms sans utiliser les [] , cad les tableux, ms re... pointeur [ par djkill55 ] hijdebute avec les pointeur dc vs avez remarquez que g du mal..j aimerais savoir cmt fait on pr trouver l adresse de la premiere letrre du dernier mot POINTEUR aye aye aye [ par djkill55 ] quelqun peut m expliquer pk ce programe ne marche pa svp...???le but c de remplir une matrice [3][3]a l aide des pointeur, la fct initializ est celle Pb avec Template [ par Diabolus ] Salut à tous,J'ai un problème avec les templates. Je veux faire une liste chainée qui fonctionne avec les templates.Mon problème arrive au moment où j


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales