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 Ausdruck c_func() || "" vom Typ bool , schliesslich benutzt du den logischen OR-Operator. Und damit kann std::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


Log in to reply