Lebensdauer eines "const char*"-Parameters



  • Allerdings solltest du dich nicht darauf verlassen, daß der Aufrufer wirklich nur String-Literale übergibt. Er könnte ja auch sowas machen:

    void test()
    {
      char ausgabe[]="Hallo Welt!";
      hallo(ausgabe);
    }
    

    In dem Fall wird der char-Zeiger ungültig, sobald die Funktion test() verlassen wird (und wie du siehst, passiert das sofort, nachdem hallo() zurückgekehrt ist).



  • Danke! Genau das war mein Fehler! 😃

    Das war mir bei genauerer Betrachtung klar, daß das so nicht geht. (War aber einfach zu verführerisch...)
    Aber mir war nicht klar warum die Stringparameter in Anführungsstrichen nicht verfallen.



  • Gibt es 'ne brauchbare Methode, um hallo(ausgabe); trotzdem zu realisieren?

    Evtl. den String mit new erzeugen? Aber wer macht dann das delete?
    Und was passiert, wenn ich ein Stringliteral mit delete lösche? 😕



  • Was genau is denn dein Problem? Stringlitheral mit delete löschen ist keine gute Idee. Sollte irgendeine Art von undefiniertem Verhalten erzeugen! 🙂



  • Du könntest dir einen std::string nehmen und den nach Bedarf herumkopieren - ist sowieso eleganter (und sicherer) als mit nackten char-Zeigern zu werfen.



  • Naja, ich will einen lokalen String in eine Exception-Klasse reinpacken, die als Konstruktor einen "const char*"-Zeiger hat.
    Bisher habe ich sowas wie

    throw ExcClass("Hossa!");
    

    gemacht. Jetzt habe ich aber einen lokalen String, den ich da reinstecken will. Daher brauche ich auch sowas:

    char ausgabe[]="Nu guck!";
      throw ExcClass(ausgabe);
    


  • Die einfachste Lösung: ersetze den 'const char*' durch einen 'const std::string' in der Exception-Klasse.

    Wenn du unbedingt bei deinen char-Zeigern bleiben willst, muß der Ctor der Exception-Klasse eigenen Speicher anfordern und den String mit strcpy() dort reinpacken - und der zugehörige Dtor gibt den Speicher wieder frei. (dann mußt du aber auch den Copy-Ctor und operator= anpassen)

    PS: Du weißt, daß Exceptions zur Ausnahmebehandlung da sind?



  • Naja, das Design stammt nicht von mir und man wollte wohl bei Basistypen bleiben.
    Bei Ausnahmen bin ich sonst auch nicht so ein Geschwindigkeitsfanatiker.
    Ich kopiere ggf. lieber Objekte rum. Langsam werden mir die Vorzüge der Strings und Streams bewußt.
    Wieder was gelernt ... Danke!



  • stimpleton schrieb:

    Langsam werden mir die Vorzüge der Strings und Streams bewußt.

    Wieder ein User, den ich von den Vorzügen der C++ Standardbibliothek überzeugen konnte 😃



  • CStoll schrieb:

    Wieder ein User, den ich von den Vorzügen der C++ Standardbibliothek überzeugen konnte 😃

    Die helle Seite der Macht ist stark in dir 😉

    Vielleicht ist es aber auch garnicht so schwer wenn man langsam dahinter kommt das es vielleicht gute Gründe gibt warum die STL im Standard enthalten ist.

    cu André
    [Aus unbekannter Quelle:
    Joda: Dunkel die andere Seite, sie ist.
    Obi Wan: Sei still Joda und ess endlich deinen Toast.]



  • asc schrieb:

    Aus unbekannter Quelle:

    german-bash.org, später auch als Übersetzung im amerikanischen bash.org? 😉

    *scnr*


Anmelden zum Antworten