global maps?!



  • Hast du wirklich geprüft, ob dieser Code den Fehler überhaupt reproduziert?

    Kann es sein, dass du (in deinem echten Code) mehrere Instanzen von Class erzeugst?



  • Bei mir hat test_map einen Eintrag.
    Warum es nur einer ist und nicht fünf (Schleife wir ja 5 mal durchlaufen) ist dir klar?



  • Mein Debugger ist scheinbar schrott... offenbar sind Einträge vorhanden, die jedoch nicht vom Debugger angezeigt werden! Ich habe nach der for Schleife folgendes gemacht:

    string c = "Name";
    //test_map.count(c);
    if (test_map.count(c)>0)
    {
    	printf("\nWelcome ist drin!\n"); //Code wird erreicht, also ist Welcome drin!
    }
    

    Also zeigt der Debugger den Inhalt der map nicht an, aber es ist was drin. Trotzdem kann ich die in der Map gespeicherten Daten nicht "verwenden". Also Klasse A ist irgendwie nicht "funktionsfähig".

    @inter2k3:
    Ehrlich gesagt ist mir nicht so richtig klar, warum es nur einen Eintrag gibt?! Weil es nur eine Instanz von A gibt, die dann immer überschrieben wird?



  • Max064 schrieb:

    Weil es nur eine Instanz von A gibt, die dann immer überschrieben wird?

    Nein, weil es 5 Instanzen gibt, die aber alle als Name "Name" drin haben. Und da die map für einen key immer nur ein value haben kann, wird beim insert ab dem zweiten A immer ein neues Objekt als value für den selben key reingehängt.

    Welche IDE bzw. welchen Compiler und welchen Debugger verwendest du?



  • Ich verwende Visual Studio 2008 SP1...

    Entstehen dann so 5 Enträge? Mein Debugger zeigt immer noch keinen an...

    void Class::f()
    {  
       string text;
       text = "Name";
       for(int i =0; i< 5; i++)
       {
          inst = new A();
          inst->SetName(text);
          text = text + "neu";
    
          test_map.insert(pair<string, A*>(inst->GetName(), inst));
       }
    }
    


  • Max064 schrieb:

    Entstehen dann so 5 Enträge?

    Ja.



  • also ich habs mal so debuggt:

    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    class A;
    class Class
    {
    public:
        map<string, A*> test_map;
        void f();
        A* inst;
        ~Class();
    };
    class A
    {
    public:
        string Name;
        const string& GetName() const
        {
            return Name;
        }
        void SetName(const string& NameNew)
        {
            Name = NameNew;  
        }
    
        A(){}
    }; 
    
    void Class::f()
    {  
       string text;
       text = "Name";
       for(int i =0; i< 5; i++)
       {
          inst = new A();
          inst->SetName(text);
          text = text + "neu";
    
          test_map.insert(pair<string, A*>(inst->GetName(), inst));
       }
    }
    
    Class::~Class()
    {
       for (map<string, A*>::iterator it = test_map.begin(); it != test_map.end(); ++it)
       {
          delete it->second;
       }
    }
    
    int main()
    {
       Class c;
       c.f();
    }
    

    wenn man nach dem Aufruf von c.f() in den Debugger schaut sollte es in etwa so aussehen: http://www.image-load.net/page.php?type=jpg&f=c0aa0d5bb61add46b09675b97b058934



  • pumuckl schrieb:

    Class::~Class()
    {
       for (map<string, A*>::iterator it = test_map.begin(); it != test_map.end(); ++it)
       {
          delete it->second;
       }
    }
    

    Was genau bewirkt der Destruktor? Brauch ich den?

    Mein Debugger zeigt immer noch 0 Elemente an, aber mittlerweile kann ich die Objekte in der map, die laut Debugger nicht mal vorhanden sind ;-), benutzen...



  • Max064 schrieb:

    Was genau bewirkt der Destruktor? Brauch ich den?

    Der bewirkt, dass der Speicher, den du mit new angefordert hast, auch wieder freigegeben wird.
    Ist aber nur sehr murkelig implementiert, da z.B. bei dem schon dagewesenen Fall, dass der key bereits in der map vorhanden war, immernoch Speicherlecks entstehen.



  • Du solltest besser die Objekte selbst in die map stopfen, nicht die Zeiger darauf. Dann werden sie auch von der Map verwaltet und sie gehen zusammen mit der Map unter...



  • An der Stelle ist es leider nicht ohne weiteres möglich, die Objekte selber reinzustopfen.

    Trotzdem wird es keine Probleme geben, da nur eine feste Anzahl an Instanzen der Class Klasse erstellt werden, die während der gesamten Laufzeit konstant ist.


Anmelden zum Antworten