Wie strdup freigeben?
-
Hallo Forum,
wie gibt man eigentlich einen char* der mit strdup angefordert wurde wieder frei? free oder delete[]?
-
wenn eins von den beiden dann free. strdup ist ne C-Funktion, und delete ist kein Bestandteil von C.
-
Was soll das denn sein?
-
http://www.opengroup.org/onlinepubs/009695399/functions/strdup.html ...
Wobei du einfach folgendes nehmen solltest:std::string a("Das ist ja ein Toller string!"); std::cout << a << std::endl; std::string b(a); std::cout << "Dublikat: " << b << std::endl;
-
Ich denke kaum einer kommt auf die Idee strdup zum duplizieren zu verwenden.
Meistens geht es darum, dass "komische" C-APIs of oft ein char* anstatt ein const char* verlangen.
-
Genau! Ich muß einer Api ein Passwort als char* übergeben. Da hätten sie auch in der Api noch ein const vorsetzen können...
Vielen Dank für die Hilfe

-
Wenn strdup aus oben genannten Gründen unbedingt sein muss, so empfehle ich folgende Konstruktion:
#include <string> #include <boost/shared_ptr.hpp> // ... std::string txt = "das ist ein Text"; boost::shared_ptr< char > txt2( strdup( txt.c_str() ), &free ); // Zugriff auf die String-Kopie mit 'txt2.get()'So wird der allokierte Speicher sicher und ohne zusätzlichen Code am Ende des Scopes wieder freigegeben, selbst wenn eine Exception fliegt.
Gruß
Werner
-
Und hier eine Alternative, die ohne C und ohne Boost auskommt:
std::string txt = "das ist ein Text"; std::vector< char > txt2( txt.begin(), txt.end() ); // Zugriff auf die String-Kopie mit '&txt2[0]'Dürfte auch nur wenig imperformanter sein, wenn man annimmt dass der vector-Ctor bei Random-Access-Iteratoren die Länge im Voraus berechnet.
EDIT:
Hilfe, da fehlt ja das Nullbyte...std::vector< char > txt2( txt.c_str(), txt.c_str() + txt.length() + 1 );
-
studi_x schrieb:
Genau! Ich muß einer Api ein Passwort als char* übergeben. Da hätten sie auch in der Api noch ein const vorsetzen können...
wenn du sicher bist, dass das API das passwort nicht verändert, dann caste das 'const' weg. das erspart dir die kopie.

-
pumuckl schrieb:
strdup ist ne C-Funktion
Nicht mal das. strdup ist gar nichts, weder ISO C noch C++. Sollte man daher auch nicht verwenden. In C++ gibt es einfachere Möglichkeiten.