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?
-
Forumsuche ergibt: http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607.html
Grüssli
-
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.