Speicher mit GlobalAlloc



  • Hallo,

    ich gebe speicher frei:

    std::string gleichung;
    z = sizeof(gleichung);
    
    GlobalAlloc(GMEM_FIXED,z);
    

    ... der hat genauso viele Bytes wie mein String.
    1. Jetzt kapier ich aber nicht wie ich den String "gleichung" genau in den von mir frei gemachten Speicher schreibe.
    2. Wie kann ich dann herausfinden wo genau sich der Speicher mit meinem String befindet, also ich brauche die Adresse, geht das mit dem Adressoperator oder gibts da was anderes?

    THX for HELP 😉



  • RunSeb schrieb:

    Hallo,

    ich gebe speicher frei:

    Wo?

    std::string gleichung;
    z = sizeof(gleichung);
    
    GlobalAlloc(GMEM_FIXED,z);
    

    ... der hat genauso viele Bytes wie mein String.

    Bist du sicher, dass du sizeof(gleichung) und nicht gleichung.size() willst?

    1. Jetzt kapier ich aber nicht wie ich den String "gleichung" genau in den von mir frei gemachten Speicher schreibe.
    2. Wie kann ich dann herausfinden wo genau sich der Speicher mit meinem String befindet, also ich brauche die Adresse, geht das mit dem Adressoperator oder gibts da was anderes?

    Mir scheint du hast noch ein paar grundlegende Verständnisprobleme. Was *genau* möchtest du denn erreichen?



  • Ich möchte das der Inhalt des Strings "gleichung" in einen von mir allozierten Speicherbereich steht. Das wollte ich eigentlich mit GlobalAlloc machen.
    Das ich Verständnisprobleme hab ist mir schon klar, darum frag ich auch hier mal nach. 😉



  • sizeof( gleichung ) gibt dir nicht die Länge des strings zurück sondern die größe des String-Objekts (was nicht zwangsläufig eqivalent zur Länge des Strings ist). 😉 Dafür hat std::string die Methode size().



  • OK, das ist mir jetzt klar.

    z = gleichung.size();
    

    aber wie bekomm ich den String jetzt in den Speicher?



  • An die Daten des Strings kommst du mit str.data() (Ohne \0-terminierung) bzw. str.c_str() (mit \0 am Ende, also als c-string)



  • Wenn du willst, daß ein std::string seine Daten über GlobalAlloc()/GlobalFree() verwaltet anstelle von new[]/delete[], mußt du einen eigenen Allocator schreiben, der diese Funktionen zur Speicherveraltung verwendet - und den an basic_string mitgeben:

    //hier kannst du die Klasse std::allocator<> als Vorbild nehmen
    template<typename T>
    class GlobalAllocator
    {
      ...
    };
    
    //um Schreibarbeit zu sparen - ein GA_String funktioniert wie ein normaler string,
    //aber nutzt GlobalAlloc() und Co. zur Speicherverwaltung
    typedef std::basic_string<char,char_traits<char>,GlobalAllocator<char> > GA_String;
    

    PS: Einige Informationen zu dem Thema findest du auch in meinem Magazin-Artikel "Speicherverwaltung in C++ (und C)"



  • Das mit dem Allocator ist eine verdammt saubere Lösung!

    Aber nur um deine Anfrage anders zu interpretieren (der Inhalt des Strings soll in einen Speicherbereich, geholt mit GlobalAlloc, kopiert werden):

    std::string gleichung;
    size_t z = gleichung.size()+1; // Damit auch die '\0' am Ende mit dabei ist
    char* sPtr = (char*) GlobalAlloc( GMEM_FIXED, z );
    memcpy( sPtr, gleichung.c_str(), z );
    
    ...
    // Irgendwas mit machen:
    sPtr[0] = 'a'; // Davon bleibt "gleichung" unverändert, weil sPtr eine Kopie ist
    gleichung.reverse(); // Davon bleibt der Speicherbereich in sPtr unverändert
    ...
    
    GlobalFree( (HANDLE) sPtr );
    

Anmelden zum Antworten