realloc()



  • Hallo zusammen,

    ich bin gerade dabei mir eine eigene String-Klasse zu schreiben. Ich weiß, das Internet ist voll davon, aber ich möchte unicode benutzen, meine Programme nicht mit dem übermäßigen Balast anderer Bibliotheken (wie Qt) belasten und zudem viel dabei lernen.
    Jetzt stellt sich bei mir die Frage nach einer guten Speicherverwaltung:

    1. Um keinen unnötigen Speicher zu verbrauchen verzichte ich auf die Dateinspeicherung in linked lists und nehme stattdessen Arrays. Da sich die Größe eines Strings aber schon mal ändern kann, soll wenn möglich nicht immer der gesamte String kopiert werden. Soweit ich weiß, gibt es keine Möglichkeit, die Größe eines mit new[] erzeugten Speicherbereichs zu ändern. Es wird wahrscheinlich noch nicht einmal eine Verkleinerung wie unten funktionieren, denn woher soll delete[] wissen, was es mit der übergebenen Adresse anfangen soll, richtig?

    // Speicher reservieren
    char_type* speicher = new char_type[size];
    
    // Teilweise befüllen
    int stringlen = 0;
    speicher[stringlen] = 12345; ++stringlen;
    speicher[stringlen] = 23456; ++stringlen;
    
    // Restlichen Speicher freigeben
    delete[] &(speicher[stringlen]);
    

    2. Es wäre deshalb so etwas wie das realloc() aus der cstdlib interessant. Wäre es in C++ "gefährlich" malloc(), realloc() und free() zu benutzen? Um die Initialisierung und das Freigeben des Speichers werde ich mich schon kümmern. Aber vielleicht funktionieren die C-Funktionen ja nicht richtig, wenn ich sie in C++ benutze? Folgendes scheint anstandslos zu funktionieren:

    // Speicher reservieren
    char_type* speicher = (char_type*)malloc(size*sizeof(char_type));
    
    // Teilweise befüllen
    int stringlen = 0;
    speicher[stringlen] = 12345; ++stringlen;
    speicher[stringlen] = 23456; ++stringlen;
    
    // Restlichen Speicher freigeben
    speicher = (char_type*)realloc((void*)speicher, (stringlen)*sizeof(char_type));
    

    3. In diesem Beitrag hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-218605.html wurde der Fragesteller immer wieder darauf verwiesen std::vector zu benutzen. Das möchte ich aber nicht, weil zum einen in einem std::vector mehr Speicher als nötig vorgehalten wird, was sich bei strings ziemlich summieren kann und ich zum anderen Spaß daran habe, das selbst zu machen und etwas dabei zu lernen.



  • Wäre es in C++ "gefährlich" malloc(), realloc() und free() zu benutzen?

    Im Grunde eigentlich nicht. Soweit ich weiß, sind new/delete oft auch nur über malloc/free implementiert. Und ein direktes Synonym für realloc gibt es nicht, hier sehe ich also auch Vorteile. Das Problem bei malloc/free ist, dass Konstruktoren/Destruktoren nicht automatisch aufgerufen werden, wenn du es mit Klasseninstanzen zu tun hast.



  • Du kannst C-Funktionen problemlos in C++ benutzen wenn du C und C++ nicht zu sehr mischst. Du kannst die Speicherverwaltungsfunktionen der malloc()-Familie benutzen unter folgenden Bedingungen (sind nicht unbedingt alle):
    - mische auf keinen Fall malloc & Co mit new & Co, soll heißen Speicher der mit malloc() allokiert wurde darf nicht mit delete freigegeben werden und umgekehrt.
    - benutze malloc & Co nur für C-kompatible Typen, also PODs. malloc ist kein C++, und deine C++-Implementation könnte sich auf ein bestimmtes Verhalten von new verlassen, das malloc nicht bringen kann.


Anmelden zum Antworten