Hilfe!!! Speicher Lecks mit NativeXML



  • hallo,

    hat jemand Erfahrung mit TNativeXml? ich benutze das Tool zum Parsen meine Xml files. ich kann zwar mein ziel ohne Problem erreichen, aber es verursact mir Speicherlecks. Ich bunutze C++ builder 5.5. mit seinem CodeGuard habe ich versucht, den Speicherlecks zu finden, Aber es hat nichts gebracht.

    Also ich brauche jede Art von Tipps. Ich muss nicht unbedingt TNativeXml benutzen. man kann mir ein andere Tools empfehlen. oder Lösungsvorschläge, damit ich meine Speicherlecks raus finde, woran es liegt.

    das Prinzip ist:
    1. ich parse meine XML file mit hilfe TNativeXml und packe alle relevante Informationen in TList ein. dann gebe ich natürlich die TNativeXml Zeiger frei.
    (aber es gibt keine Auswirkung. erst wenn ich die TList freigebe, dann wird der Speicher freigegeben, aber einen Teil.)
    2. Danach erzeuge ich einen Text file, den ich später brauche.
    3. Dann Lösche ich die Liste.

    PS: wenn ich die Liste gleich nach dem Parsen des Files leere, wird der belegte Speicher complete freigegeben.

    ich verstehe nicht, was hat TNativeXml mit der TList zu tun? was hängt damit zusammen?

    vielen vielen Dank für eure Aufmerksamkeit und werte Tipps.

    gruss

    Marek



  • burkut schrieb:

    hat jemand Erfahrung mit TNativeXml? ich benutze das Tool zum Parsen meine Xml files. ich kann zwar mein ziel ohne Problem erreichen, aber es verursact mir Speicherlecks.

    Benutzt du denn mittlerweile Smart-Pointer? Zeig mal deinen Code.



  • hallo,

    hier ist der Code:

    void TVerwFahrplan::Test3(AnsiString FileName)
    {
     g_D_LinieStatElem   LinieStatDaten;
            TNativeXml *xmlFplan1 = new TNativeXml();
            TXmlNode* EingJourneyList = NULL;
            TXmlNode* EingXmlRoot = NULL;
            TXmlNode* EingKnoten = NULL;
            TList *myFPlan  = new TList();
    
             xmlFplan1->LoadFromFile(FileName); 
             EingXmlRoot = xmlFplan1->Root; // ganz oben anfangen 
             EingJourneyList = EingXmlRoot-> FindNode(JourneyList); // Kontrolle weitere Daten vorh
             if (EingJourneyList)
             { 
                for (int i=0; i<EingJourneyList->NodeCount; i++)
                {
                   EingKnoten = EingJourneyList->Nodes[i];                   
                        g_D_FahrPlanDaten    *FplanDaten = new  g_D_FPlanDaten();
                        parseFPlan.holeFPlan(EingKnoten ,  FplanDaten ); // parst die nötigen Daten aus dem Xml Knoten raus
                        if (g_V_FPlanListeFkt.FL_GetElem(*FplanDaten) == NULL)    // Element noch nicht enthalten                        {
                        {
                           myFPlan->Add( FplanDaten);
                        }
                       else
                        {
                           delete FplanDaten;
                           FplanDaten = NULL;
                        }       
    
                }
             }
                if (myFPlan != NULL)
                    {
                       creatFPlan( myFPlan);
                       for (int i = 0; i < myFPlan->Count; i++)
                        {
                         g_D_FPlanDaten *AStruct = (g_D_FPlanDaten*) myFPlan->Items[i];
                          delete AStruct;
                          AStruct = NULL; 
                        }
                        myFPlan->Clear();
                        delete myFPlan;
                        myFPlan = NULL;
                    }
               VF_LPlanErzeugen();           // Dateien fuer Module erzeugen
               VF_ModPlanErzeugen();            // Dateien fuer Module erzeugen             
    
              g_V_FPlanListeFkt.FL_LoescheListe(true);
              g_V_FPlanListeFkt.LS_LoescheListe(true);
    
               if (xmlFplan1!= NULL)
                  {
                     xmlFplan1->Clear();
                     delete xmlFplan1 ;
                     xmlFplan1 = NULL;
                  }
    
    }
    


  • Ich sehe keine Smart-Pointer.

    Lies dir das hier durch und benutze std::auto_ptr<> anstelle manueller Freigabe. Außerdem solltest du std::vector<g_D_FahrPlanDaten> anstatt einer untypisierten TList benutzen und die Objekte nicht mit "new" anlegen.



  • audacia schrieb:

    Ich sehe keine Smart-Pointer.

    Lies dir das hier durch und benutze std::auto_ptr<> anstelle manueller Freigabe.

    Ähm, einverstanden, aber wegen der merkwürdigen Zuweisungssemantik von auto_ptr und weil er in C++0x als deprecated markiert ist, würde ich bei neuen Programmen, wenn man einen neueren C++ Builder mit Boost hat, lieber zu shared_ptr oder unique_ptr greifen.



  • Du hast natürlich recht, unique_ptr<> ist besser geeignet - aber zu unique_ptr<> gibt es nur nicht so schöne, für Anfänger geeignete deutschsprachige Links.

    Wir können ihn ja mit dem Ratschlag beglücken, den verlinkten Artikel dennoch zu lesen, in seinem Code aber einfach auto_ptr<> mit unique_ptr<> zu substituieren. Ich bin gespannt, ob das klappt 😉



  • Das Problem wurde anderes gelöst...



  • Willst du uns nicht sagen wie?

    Und warum drückst du dich um Smart-Pointer? 😉


Anmelden zum Antworten