Memory Leak bei STD::Map


  • Mod

    Man sollte mal erwähnen, dass die ganze Prämisse bezüglich einer fehlenden Hashmap falsch ist:
    http://en.wikipedia.org/wiki/Unordered_associative_containers_(C%2B%2B)#History



  • Mal abgesehen hat C++ bereits eine Hashmap. std::unordered_map.

    Edit: Ach Mist, zu langsam 😞



  • Hymir90 schrieb:

    jawohl jawohl, ich gebs ja zu! ^^ Ich komm aus der Java-Ecke und hab grad echte Probleme mit den Pointern usw. Danke erstmal für die vielen Antworten. Ich werde mir das mal in Ruhe anschauen!

    Das macht aber gar nichts. Zeiger brauchst du in C++ nur selten. Deswegen kannst du Zeiger erstmal aus deinem Kopf streichen. 😉



  • In Boost und der C++11-Bibliothek gibts übrigens eine unordered_map, dürfte in deine Richtung gehen 😉

    Wie deine Hashfunktion aussehen könnte:

    #ifndef stringutils_hpp
    #define stringutils_hpp
    
    namespace stringutils{
      /**
         hashSDBM
         wandelt char* in Hashwert (SDBM - Algorithmus)
         @param strToHash            zu hashender String
         @return Hashwert
      */
      unsigned long hashSDBM(char const* strToHash){
        unsigned long hash = 0;
        for(;*strToHash;++strToHash)
          hash = *strToHash + (hash <<6) + (hash <<16) - hash;
        return hash;
        }
    
    #endif
    

    Wobei ich nicht sicher bin, ob das so klug ist, char* als Parameter zu haben, wenn hash ein unsigned long ist. char ist nicht notwendigerweise unsigned, so dass folgendes z.B. Murks erzeugt:
    hashSDBM("\x80") -> \x80 = (char)128 = -128 für signed char
    -> hash = -128 + (0<<6) + (0<<16) - 0 = -128 -> Unterlauf
    Ein Compiler sollte da auch eine Warnung bzgl. signed/unsigned mismatch liefern



  • pumuckl schrieb:

    Wobei ich nicht sicher bin, ob das so klug ist, char* als Parameter zu haben, wenn hash ein unsigned long ist. char ist nicht notwendigerweise unsigned, so dass folgendes z.B. Murks erzeugt:
    hashSDBM("\x80") -> \x80 = (char)128 = -128 für signed char
    -> hash = -128 + (0<<6) + (0<<16) - 0 = -128 -> Unterlauf
    Ein Compiler sollte da auch eine Warnung bzgl. signed/unsigned mismatch liefern

    An welcher Stelle genau soll es da eine Warnung geben und warum?
    Würde static_cast<unsigned char>(*strToHash) deine hypothetische Warnung verstummen lassen?

    @Hymir90: Informiere dich, was tatsächlich eine Hash Map ist und tut. Dein Ansatz verwendet den Hash als eindeutigen Schlüssel für die std::map , obwohl natürlich mehrere Elemente den gleichen Hash haben können. Außerdem hat eine Hash Map typischerweise konstante Such- und Einfügezeit, nicht logarithmische wie std::map .



  • out schrieb:

    Hymir90 schrieb:

    jawohl jawohl, ich gebs ja zu! ^^ Ich komm aus der Java-Ecke und hab grad echte Probleme mit den Pointern usw. Danke erstmal für die vielen Antworten. Ich werde mir das mal in Ruhe anschauen!

    Das macht aber gar nichts. Zeiger brauchst du in C++ nur selten. Deswegen kannst du Zeiger erstmal aus deinem Kopf streichen. 😉

    Ach ja? Wie macht ihr dass wenn ihr Referenzen auf Objekte oder sogar Listen mit Referenzen auf Objekte braucht?


  • Mod

    Butterbrot schrieb:

    Das macht aber gar nichts. Zeiger brauchst du in C++ nur selten. Deswegen kannst du Zeiger erstmal aus deinem Kopf streichen. 😉

    Ach ja? Wie macht ihr dass wenn ihr Referenzen auf Objekte oder sogar Listen mit Referenzen auf Objekte braucht?

    Mit Pointern. Aber das brauche ich nur selten. 🙂



  • Butterbrot schrieb:

    Ach ja? Wie macht ihr dass wenn ihr Referenzen auf Objekte oder sogar Listen mit Referenzen auf Objekte braucht?

    Referenzen auf Objekte -> Referenzen. Letzteres kommt so gut wie nie vor ud wird meistens durch Iteratoren ersetzt.

    //und und bei den wenigen Fällen die übrig bleiben Pointer. Aber dann hängt da meistens keine Speicherverwaltung mit dran.



  • Ich Frage nur weil ich mich gerade mit Design Patterns beschäftige und dort ständig Pointer einsetze, dann mache ich wohl was falsch. Kann man denn eine Liste mit Referenzen haben, wie mache ich das mit Null Referenzen? Vielleicht NULL-Objekte erstellen?



  • Ja, Java in C++ ist eine ganz schlechte Idee.



  • Butterbrot schrieb:

    Kann man denn eine Liste mit Referenzen haben, wie mache ich das mit Null Referenzen? Vielleicht NULL-Objekte erstellen?

    Was für eine Liste meinst du eigentlich genau? Am Besten machst du einen eigenen, neuen Thread auf (und verlinkst auf diesen), und zeigst mal ein bisschen. Da kannst du dann deine Fragen und Wünsche äußern... Ansonsten werden wir hier immmer mehr off-topic.



  • Butterbrot schrieb:

    out schrieb:

    Hymir90 schrieb:

    jawohl jawohl, ich gebs ja zu! ^^ Ich komm aus der Java-Ecke und hab grad echte Probleme mit den Pointern usw. Danke erstmal für die vielen Antworten. Ich werde mir das mal in Ruhe anschauen!

    Das macht aber gar nichts. Zeiger brauchst du in C++ nur selten. Deswegen kannst du Zeiger erstmal aus deinem Kopf streichen. 😉

    Ach ja? Wie macht ihr dass wenn ihr Referenzen auf Objekte oder sogar Listen mit Referenzen auf Objekte braucht?

    Wenn ich Listen mit Referenzen auf Objekte brauche, lehne ich mich zurück und überlege, ob ich es wirklich brauche. Das hört sich so an, als wäre es in der Regel ein Designfehler. Und wenn ich wirklich Listen mit Referenzen auf Objekte brauche, dann mache ich das halt. Also dann Listen mit Zeigern. Aber wie Hymir90 richtig sagt: das braucht man halt selten.



  • Ist nur schwierig für mich Design Pattern ohne Zeiger zu implementieren. Hier habe ich einen Thread dazu aufgemacht: http://www.c-plusplus.net/forum/308689

    Ich bin für jede zeigerlose Implementierung eines Design Patterns dankbar.



  • Zeig doch mal ein konkretes Pattern her, das du mit Zeigern implementieren wuerdest.



  • Kellerautomat schrieb:

    Zeig doch mal ein konkretes Pattern her, das du mit Zeigern implementieren wuerdest.

    Warum folgst du nicht dem Link?



  • Uebersehen. 😮


Anmelden zum Antworten