Frage zu std::string und NULL
-
Hallo, ist es definiert was passiert, wenn ich einen std::string mit NULL initialisiere?
std::string test(NULL);
Ist er immer "leer", oder ist das Verhalten immer undefiniert oder Implementierungsabhängig?
-
hättest du es mal ausprobiert...es stürzt ab
-
oO schrieb:
hättest du es mal ausprobiert...es stürzt ab
Nein, das Verhalten ist wie üblich undefiniert.
Gilder, gibt es einen Grund, wieso du das wissen möchtest?
-
Ich habe hier ne alte C-Funktion die mit char* statt std::string arbeitet. Jetzt wollte ich nen wrapper darum schreiben, dass man das ganze auch mit std::string benutzen kann. Allerdings benutzt die alte C-Funktion "return NULL" um anzuzeigen, dass was schief gelaufen ist. Und offensichtlich ist es keine gute Idee, einen string mit dem return wert dieser Funktion zu initialisieren, ohne ihn vorher auf NULL zu prüfen
-
std::string bla (c_func() || "");
sollte helfen können, falls du den Fall, dass was schief gelaufen ist nicht eh gesondert behandeln willst.
-
.filmor schrieb:
std::string bla (c_func() || "");
sollte helfen können, falls du den Fall, dass was schief gelaufen ist nicht eh gesondert behandeln willst.
Nein, das wird immer
true
geben, weil "" ein Stringliteral ist, dessen Adresse implizit auf Ungleichheit mit 0 geprüft wird - es kann aber nie 0 sein. Also hast du einen Ausdruckc_func() || ""
vom Typbool
, schliesslich benutzt du den logischen OR-Operator. Und damit kannstd::string
nichts anfangen.Besser wäre:
char* text = c_func(); std::string str(text != 0 ? text : "");
Die explizite Prüfung auf Ungleichheit mit 0 ist nicht erforderlich, aber ich mag sie der Übersicht halber. Am einfachsten ist es sowieso, man schreibt sich eine Wrapper-Funktion, die immer einen gültigen String (am besten
const char*
, damit man auch nicht aus Versehen in Stringliterale reinschreibt) zurückgibt.Andere Frage: Wie wird der Speicher des
char*
-Strings wieder freigegeben?
-
meinst du
std::string text(cfunc() ? cfunc() : "");
? In deinem Fall würde man dem string ein bool zuweisen
-
Gilder schrieb:
meinst du
std::string text(cfunc() ? cfunc() : "");
? In deinem Fall würde man dem string ein bool zuweisen
Er meinte das wahrscheinlich. Aber das Beispiel ist schlecht, da
cfunc()
zweimal ausgeführt wird.Ich habe meinen Post oben noch ergänzt, wäre gut, wenn du den noch anschauen könntest.
-
was spricht denn gegen
const char* value = zu_wrappende_fkt(); if(!value) return std::string(); //was auch immer du sonst noch machen möchtest
je nach anwendungsfall könnte auch ne exception angebracht sein
bb