Speicher freigeben - schönere Lösung?



  • Hi,

    Ich habe folgenden Code um von wstring nach string zu konvertieren:

    std::string to_string (const std::string_type value)
    {
        char* buffer = new char[value.size () + 1];
        wcstombs (buffer, value.c_str (), value.size ());
        std::string result (buffer);
        delete [] buffer;
        return (result);
    }
    

    Die Sache mit der Speicher-allokierung und Freigabe gefällt mir noch nicht so sehr. Hat da ggf. jemand eine schönere Lösung parat? Vielleicht mit boost oder ohne boost?


  • Administrator



  • Du sollst meinen Text lesen. Mir geht es um die Speicherverwaltung, also um ein Sprach-Feature und nicht um die Konvertierung.



  • Der Coder schrieb:

    Ich habe folgenden Code um von wstring nach string zu konvertieren:

    std::string to_string (const std::string_type value)
    {
        char* buffer = new char[value.size () + 1];
        wcstombs (buffer, value.c_str (), value.size ());
        std::string result (buffer);
        delete [] buffer;
        return (result);
    }
    

    Ich seh da kein wstring

    Hat da ggf. jemand eine schönere Lösung parat? Vielleicht mit boost oder ohne boost?

    Mit boost scoped_ptr



  • CoderOnHorsefeed schrieb:

    Mit boost scoped_ptr

    Ja! genau sowas habe ich gesucht, doch boost::scoped_ptr::get () ist const, daher kann ich aus wcstombs keine daten in das Array füllen. 😞 Kurz: geht nicht 😞



  • Dein Code ist nicht exception-safe, wenn eine Exception auftritt hast du ein Memory-Leak. Abhilfe schafft, aber der boost::scoped_ptr oder auch der std::auto_ptr



  • Der Coder schrieb:

    CoderOnHorsefeed schrieb:

    Mit boost scoped_ptr

    Ja! genau sowas habe ich gesucht, doch boost::scoped_ptr::get () ist const, daher kann ich aus wcstombs keine daten in das Array füllen. 😞 Kurz: geht nicht 😞

    Sicher, dass du das richtig verstanden hast?



  • Ha! Ihr seid doch nicht so schlau wie ihr tut! Ich dürfte nicht scoped_ptr sondern scoped_array nehmen! Ha 😉



  • Ich hab beides auch noch nie verwendet. 🤡 Aber das const bei dem get() hatte nichts mit dem Returnwert zu tun.



  • std::vector<char> buffer(value.size () + 1);
    wcstombs (&buffer[0], value.c_str (), value.size ());
    

    Sollte auch gehen.



  • Der Coder schrieb:

    Du sollst meinen Text lesen. Mir geht es um die Speicherverwaltung, also um ein Sprach-Feature und nicht um die Konvertierung.

    Dravere hat die richtige antwort gegeben. alles andere hier im thread ist pfuscherei (mit Ausnahme der std::vector Idee).



  • @Shade Of Mine
    was ist an boost denn pfuscherrei?



  • Der Coder schrieb:

    @Shade Of Mine
    was ist an boost denn pfuscherrei?

    Du programmierst um das Problem herum bis die Symptome annehmbar werden - anstatt das Problem zu loesen. Das nennt man Pfuscherei.

    Das Problem ist nicht Speicher hier zu loeschen sondern eine Umwandlung von Zeichenketten - dazu braucht man keinen temporaeren Speicher.

    Deshalb waere die Loesung mit dem vector auch gut (sofern man vector dort verwenden kann). Solche Probleme treten immer auf wenn man C APIs mit C++ APIs mischt ohne eine saubere Schnittstelle zu definieren...



  • und wie kann ich von vector zu string konvertieren?



  • Der Coder schrieb:

    und wie kann ich von vector zu string konvertieren?

    Falsche Frage.

    Die Variante mit vector macht nur Sinn wenn du den vector auch weiter verwenden willst. Wenn man mit C APIs zu tun hat, ist vector oft sinnvoller als string. Da man mit &vec[0] einen validen c string bekommen kann. In dem man sogar noch reinschreiben darf.



  • Shade Of Mine schrieb:

    Der Coder schrieb:

    @Shade Of Mine
    was ist an boost denn pfuscherrei?

    Du programmierst um das Problem herum bis die Symptome annehmbar werden - anstatt das Problem zu loesen. Das nennt man Pfuscherei.

    Das Problem ist nicht Speicher hier zu loeschen sondern eine Umwandlung von Zeichenketten - dazu braucht man keinen temporaeren Speicher.

    Deshalb waere die Loesung mit dem vector auch gut (sofern man vector dort verwenden kann). Solche Probleme treten immer auf wenn man C APIs mit C++ APIs mischt ohne eine saubere Schnittstelle zu definieren...

    In dem Link von Dravere wird auch temporärer Speicher angelegt, ein std::vector ist ja nix anderes.


Log in to reply