Index: /XMLIO_V2/dev/dev_rv/context.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/context.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/context.hpp	(revision 96)
@@ -17,4 +17,5 @@
          {
             // On modifie le context courrant pour tout les ObjectTemplate
+            Context::SetContext(id);
             FieldGroup::SetContext(id);
             Field::SetContext(id);
@@ -84,5 +85,5 @@
                   
          ~Context()
-         {/* Ne rien faire de plus pour le moment */ }
+         { delete fieldDef; }
          
       protected:
Index: /XMLIO_V2/dev/dev_rv/field.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/field.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/field.hpp	(revision 96)
@@ -43,5 +43,5 @@
          
          ~Field(void) 
-         {/* Ne rien faire de plus */}	       
+         { /* Ne rien faire de plus */ }    
       
    }; // class Field 
Index: /XMLIO_V2/dev/dev_rv/field_group.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/field_group.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/field_group.hpp	(revision 96)
@@ -101,5 +101,5 @@
          }
          
-         ~FieldGroup(void) 
+         virtual ~FieldGroup(void) 
          {/* Ne rien faire de plus */}   
          
Index: /XMLIO_V2/dev/dev_rv/xmlio_group_template.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/xmlio_group_template.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/xmlio_group_template.hpp	(revision 96)
@@ -65,6 +65,11 @@
             
         
-         ~GroupTemplate()
-         {/* Ne rien faire de plus pour le moment */ }
+         virtual ~GroupTemplate()
+         {
+            for (unsigned int i = 0; i < childList.getVector().size(); i++)
+               delete childList.getVector()[i];
+            for (unsigned int i = 0; i < groupList.getVector().size(); i++)
+               delete groupList.getVector()[i];
+         }
          
       protected:
Index: /XMLIO_V2/dev/dev_rv/xmlio_object_template.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/xmlio_object_template.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/xmlio_object_template.hpp	(revision 96)
@@ -41,8 +41,8 @@
          { return (ObjectTemplate<T>::AllListObj[CurrContext].hasMappedValue(_id)); }
          
-         static const StrHashMap<T> GetCurrentListObject(void) { return (AllListObj[CurrContext]); }
+         static const StrHashMap<T>& GetCurrentListObject(void) { return (AllListObj[CurrContext]); }
+         static HashMap<string, StrHashMap<T> >& GetAllListObject(void) { return (AllListObj); }
                 
-         static void SetContext(const string& id)
-         { ObjectTemplate<T>::CurrContext = id; } 
+         static void SetContext(const string& id){ ObjectTemplate<T>::CurrContext = id; } 
          
          static string& GetCurrentContextId(void) { return (CurrContext); } 
Index: /XMLIO_V2/dev/dev_rv/xmlio_xml_node.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/xmlio_xml_node.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/xmlio_xml_node.hpp	(revision 96)
@@ -9,5 +9,5 @@
 #include <Poco/DOM/NamedNodeMap.h>
 
-//#include <Poco/DOM/AutoPtr.h>
+#include <Poco/DOM/AutoPtr.h>
 
 // EntÃªtes Poco SAX
@@ -38,4 +38,6 @@
 using Poco::HashMap;
 
+using Poco::XML::AutoPtr;
+
 namespace XMLIOSERVER
 {
@@ -46,19 +48,16 @@
          
       // TODO Mettre des auto_ptr ici car gestion de la mÃ©moire lamentable sans.
-      typedef Document* PDocument;
-      typedef Node*     PNode;
+      typedef AutoPtr<Document> PDocument;
+      typedef Node*    PNode;
          
       class XMLNode
       {
-         protected :
-            
-            XMLNode(const string& _rootName) : rootName(_rootName) { this->cNode = NULL ; }
-            
          public :
             
-            static XMLNode CreateNode(istream& _istr, const string& _rootName = string("simulation"))
+            XMLNode(const string& _rootName) : rootName(_rootName) 
+            { /* Ne rien faire de plus */}          
+
+            static XMLNode& CreateNode(XMLNode& node, istream& _istr, const string& _rootName = string("simulation"))
             {
-               XMLNode node(_rootName);
-                  
                if ((_istr.good()))
                { // S'il est possible de lire le flux en entrÃ©e ...
@@ -68,8 +67,8 @@
                   // On parse la source XML et on vÃ©rifie que le premier noeud (racine) est du type "Element"
                   // ... et Ã  pour valeur la chaÃ®ne rootName.
-                  PDocument pDoc = parser.parse(&src);
-                  if (!(pDoc->documentElement()->nodeName().compare(_rootName)))
+                  node.pDoc = parser.parse(&src);
+                  if (!(node.pDoc->documentElement()->nodeName().compare(_rootName)))
                   {
-                     node.cNode = pDoc->documentElement();
+                     node.setCNode(node.pDoc->documentElement());
                      node.goToChildElement();
                   }
@@ -77,5 +76,5 @@
                   {
                      ostringstream oss;
-                     oss << "L'Ã©lÃ©ment racine doit avoir pour valeur <" << _rootName << "> (\"" <<  (pDoc->documentElement()->nodeName()) <<"\" lue)";
+                     oss << "L'Ã©lÃ©ment racine doit avoir pour valeur <" << _rootName << "> (\"" <<  (node.pDoc->documentElement()->nodeName()) <<"\" lue)";
                      throw XMLParsingException(oss.str());
                   }    
@@ -87,43 +86,54 @@
             }
                
-            string getElementName(void) const {return (this->cNode->nodeName());}
+            string getElementName(void) const {return (this->getCNode()->nodeName());}
                 
-            bool goToNextElement(Node* nextElement = 0) 
+            bool goToNextElement(void) 
             {
-               nextElement = (!nextElement)? this->cNode->nextSibling() : nextElement;
+               PNode nextElement = this->getCNode()->nextSibling();
               
                // On parcourt la liste des "siblings" jusqu'Ã  trouver un Ã©lÃ©ment quelconque.
                for(; ; nextElement = nextElement->nextSibling())
-               if (nextElement == NULL) break;
-               else if (nextElement->nodeType() == 1)
-               {// Si l'un des noeuds est un Ã©lÃ©ment...
-                this->cNode = nextElement ;
-                return (true);
-               } 
-              return (false);
-             }
+                  if (IsPtrNull(nextElement)) break;
+                  else if (nextElement->nodeType() == 1)
+                  {// Si l'un des noeuds est un Ã©lÃ©ment...
+                     this->setCNode(nextElement) ;
+                     return (true);
+                  } 
+               return (false);
+            }
              
-             bool goToChildElement(void)
-             {
-              // On parcourt la liste des enfants jusqu'Ã  trouver un Ã©lÃ©ment quelconque.
-              if (this->cNode->firstChild())
-               if (this->goToNextElement(this->cNode->firstChild()))
-                return (true);
+            bool goToChildElement(void)
+            {
+               PNode nextElement = this->getCNode()->firstChild();
+               
+               // On parcourt la liste des enfants jusqu'Ã  trouver un Ã©lÃ©ment quelconque.
+               if (!IsPtrNull(nextElement))
+               {
+                  for(; ; nextElement = nextElement->nextSibling())
+                     if (IsPtrNull(nextElement)) break;
+                     else if (nextElement->nodeType() == 1)
+                     {// Si l'un des noeuds est un Ã©lÃ©ment...
+                        this->setCNode(nextElement) ;
+                        return (true);
+                     }
+                  return (false);
+               }
                 
-              return (false);
-             }
+               return (false);
+            }
              
-             bool goToParentElement(void)
-             { 
-              // Pas de retour au parent si on est Ã  la racine.
-              if (!(this->getElementName().compare(rootName))) return (false);
-              this->cNode = this->cNode->parentNode();
-              return (true);
-             }
+            bool goToParentElement(void)
+            { 
+               // Pas de retour au parent si on est Ã  la racine.
+               if (!(this->getElementName().compare(rootName))) return (false);
+               this->setCNode(this->getCNode()->parentNode());
+               return (true);
+            }
              
-             bool getAttributes(THashAttributes& attributes) const
-             {
-              if(!this->cNode->hasAttributes()) return (false);
-              NamedNodeMap* map = this->cNode->attributes();
+            bool getAttributes(THashAttributes& attributes) const
+            {
+                
+               if(!this->getCNode()->hasAttributes()) return (false);
+               AutoPtr<NamedNodeMap> map = this->getCNode()->attributes();
               
               for(unsigned int i = 0; i< map->length(); i++)
@@ -131,12 +141,20 @@
 
               return (true);
-             }
+            }
             
             ~XMLNode() 
             { /* Ne rien faire de plus */ }
-
+            
+         protected :
+         
+            PNode getCNode(void) const {return (this->cNode); }
+            void setCNode(PNode other) { this->cNode = other; }
+            
+            static bool IsPtrNull(PNode ptr) {return (ptr==NULL);}
+            
          private :
-                  
+            PDocument pDoc; 
             PNode  cNode;
+            
             string rootName;      
          
Index: /XMLIO_V2/dev/dev_rv/xmlio_xml_parser.hpp
===================================================================
--- /XMLIO_V2/dev/dev_rv/xmlio_xml_parser.hpp	(revision 95)
+++ /XMLIO_V2/dev/dev_rv/xmlio_xml_parser.hpp	(revision 96)
@@ -18,5 +18,5 @@
             {
                THashAttributes attributes;
-               
+                              
                do {                
                  // Traitement de l'identifiant
@@ -36,16 +36,33 @@
                   
                } while (_node.goToNextElement());               
-            }    
+            } 
+            
+            static void FreeMemory(void)
+            {
+               HashMap<string, StrHashMap<Context> > &AllListContext = Context::GetAllListObject();
+               
+               for (HashMap<string, StrHashMap<Context> >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++)
+               {
+                  string& id = (*it).first;
+                  StrHashMap<Context>& sc = (*it).second;
+                  // BUG AllListContext contient une StrHashMap<Context> liÃ©e Ã  l'identifiant "" d'oÃ¹ la vÃ©rification ci-dessous.
+                  if (id.size()>0) delete sc[id];
+               }
+            }
             
             static bool CLASS_TEST(const string& file = string("/local/testsuite/iodef_test.xml"), ostream& log = std::clog)
             {
                ifstream istr( file.c_str() , ifstream::in );
-               XMLNode node = XMLNode::CreateNode(istr);
+               XMLNode node("simulation");
+               XMLNode::CreateNode(node, istr);
                XMLParser::Parse(node);
-               log << "Nombre de Contexts listÃ©s : " << Context::GetCurrentListObject().getSize() << " contre 2 attendus."<< std::endl;
+               log << "Nombre de Contexts listÃ©s : " << Context::GetCurrentListObject().getSize() << " contre 1 attendus."<< std::endl;
                log << "Nombre de FieldGroups listÃ©s : " << FieldGroup::GetCurrentListObject().getSize() << " contre 5 attendus."<< std::endl;
                log << "Description du champs votkeavt : " << Field::GetObject("votkeavt").description << " contre \"Vertical Eddy Diffusivity\" attendus."<< std::endl;
                
                log << "Test  XMLParser ... ok !" << std::endl;
+               
+               FreeMemory(); // Pour supprimer la mÃ©moire liÃ©e Ã  l'allocation dynamique.
+               
                return (true);
             }
