delete / free



  • Kannst du nicht einfach einen std::string zurückgeben statt dieser blöden Umkopiererei?



  • Sorry, das geht leider nicht 😞 Ich brauche da unbedingt was ganz elementares -> ein reiner Speicherblock mit den Daten.

    Der Grund ist, dass die Funktion "get" in einer shared library untergebracht ist und die endgültige Version der shared library dann später nicht unbedingt mit C++ erststellt wird. Und ein Pointer auf einen Speicherbereich ist so das elementarste, was ich mir vorstellen kann. Das sollte ziemlich flexibel sein!



  • Probiers bei dem new mal mit eckigen Klammern...



  • Das hier

    char *ret = new char(html.size());
    

    sollte eher so aussehen

    char *ret = new char[html.size() + 1];
    

    Dein new Aufruf erzeugt kein Array, sonder ein Zeiger au ein einzelnes char. Die +1 unten dient dazu, dass auch die abschließende 0 reinpasst.
    Du solltest besser strncpy statt memcpy nehmen.



  • Das ist mir jetzt peinlich...
    Die eckigen Klammern haben mir doch gleich geholfen, ich bedanke mich herzlich!

    Jetzt läuft der Code wunderbar!



  • Ich würde dir trotzdem von sowas abraten:

    char* str = get();
    delete[] str;
    

    Damit verlässt du dich auf eine bestimmte Implementierung und verlierst Flexibilität. Mach lieber eine entsprechende Freigabefunktion, z.B. release() (die Namen, besonders get , können aber viel besser gewählt werden). Falls du dann beim Aufräumen noch zusätzlich etwas tun willst oder nicht mehr mit delete[] löschst, kannst du das an einer Stelle im Code ändern, statt an hunderten.



  • Nexus schrieb:

    Ich würde dir trotzdem von sowas abraten:

    char* str = get();
    delete[] str;
    

    In so einem Fall sollte das Modul, das die get()-Funktion bereitstellt, auch eine dispose()-Funktion (oder anderer Name) liefern, die alles was mit get() geholt wurde entsorgt.

    Oder einfach std::string benutzen 🙂



  • Peter09 schrieb:

    Der Grund ist, dass die Funktion "get" in einer shared library untergebracht ist und die endgültige Version der shared library dann später nicht unbedingt mit C++ erststellt wird.

    Dann darfst Du weder new (oder dispose implementieren) nutzen, noch darf das extern "C" um die Funktion fehlen.



  • Mit malloc/free lässt sich auch sehr gut (mit PODs) arbeiten, auch wenn viele Puristen das hier anders sehen. 😉



  • ~john schrieb:

    Peter09 schrieb:

    Der Grund ist, dass die Funktion "get" in einer shared library untergebracht ist und die endgültige Version der shared library dann später nicht unbedingt mit C++ erststellt wird.

    Dann darfst Du weder new (oder dispose implementieren) nutzen, noch darf das extern "C" um die Funktion fehlen.

    Ich kann das nur noch einmal betonen: Du möchtest auf gar keinen Fall in einer Shared Lib einen Speicherbereich allokieren und außerhalb der Lib ihn mit delete o. ä. freigeben. Das gibt jede Menge Ärger und funktioniert meistens nicht (insbesondere, wenn deine Lib und dein späteres Programm mit unterschiedlichen Runtime-Libs gelinkt wurden).

    Grüße


Anmelden zum Antworten