char* in Funktion erstellen



  • Hallo zusammen,
    ich möchte aus einem AnsiString einen char* machen. Da ich das mit verschiedenen Membern machen möchte wollte ich daraus eine Funktion machen.

    Meine Frage ist jetzt ob ich das so machen kann (im Debugger scheint alles ok zu sein), oder ob ich da später mit Problemen (speicher) rechnen kann:

    void __fastcall SetCharValue(char* &ToValue, AnsiString FromValue, int MaxLength)
    {
        if(ToValue)
         {
            delete [] ToValue;
         }
        ToValue = new char[FromValue.Length()+1];
        if(!ToValue)
            return;
        if(MaxLength > 0)
         {
            strcpy(ToValue, FromValue.SubString(1, MaxLength).c_str());
         }
        else
         {
            strcpy(ToValue, FromValue.c_str());
         }
        ToValue[FromValue.Length()] = '\0';
    }
    

    Danke.



  • Hallo,

    Das kannst du prinzipiell schon so machen. Ich hätte da aber ein paar Anmerkungen.

    Warum übergibst du ToValue als Parameter. Ich hätte das weggelassen und statt dessen einfach eine Rückgabe verwendet.

    Hier ist die Abfrage unnötig.

    if(ToValue)
         {
            delete [] ToValue;
         }
    

    Ein einfaches delete[] reicht hier auch da ein delete auf einen Nullzeiger einfach nichts macht.
    Die Technik hier hat das problem, dass du eigentlich nicht weist ob ToValue mit new[] erstellt wurde. Noch ein Argument für Punkt 1.

    ToValue = new char[FromValue.Length()+1];
        if(!ToValue)
            return;
    

    Auch hier ist die Abfrage unnötig. new gibt hier nie einen Nullzeiger zurück. Im Fehlerfall wird hier eine bad_alloc Exception geworfen. Also eher die abfangen oder die nothrow-Variante von new verwenden.

    Dasc hier:

    strcpy(ToValue, FromValue.SubString(1, MaxLength).c_str());
    

    lässt sich einfacher durch strncpy ersetzen. Da brauchst du den Substring nicht.



  • Braunstein schrieb:

    Hallo,

    Das kannst du prinzipiell schon so machen. Ich hätte da aber ein paar Anmerkungen.

    Warum übergibst du ToValue als Parameter. Ich hätte das weggelassen und statt dessen einfach eine Rückgabe verwendet.

    Ich dachte, weil ToValue sich in der Größe, bzw. Länge ändern kann, deswegen delete ich es auch am Anfang, um ihm eine neue Größe zuzuweisen.

    Aber du hast Recht, ich könnte z.b. auch

    char* __fastcall SetCharValue(char* ToValue, AnsiString FromValue, int MaxLength)
    
    statt
    
    void __fastcall SetCharValue(char* &ToValue, AnsiString FromValue, int MaxLength)
    

    nehmen können. Allerdings hatte mich interessiert, wie und ob das mit dem

    *&
    

    funzt.

    Hier ist die Abfrage unnötig.

    if(ToValue)
         {
            delete [] ToValue;
         }
    

    Ein einfaches delete[] reicht hier auch da ein delete auf einen Nullzeiger einfach nichts macht.

    Danke, das weiß ich, aber hab es mir irgendwie so angewöhnt. 🙂

    ToValue = new char[FromValue.Length()+1];
        if(!ToValue)
            return;
    

    Auch hier ist die Abfrage unnötig. new gibt hier nie einen Nullzeiger zurück. Im Fehlerfall wird hier eine bad_alloc Exception geworfen. Also eher die abfangen oder die nothrow-Variante von new verwenden.

    Jetzt wo dus sagst, ist es mir auch wieder eingefallen 😉

    Dasc hier:

    strcpy(ToValue, FromValue.SubString(1, MaxLength).c_str());
    

    lässt sich einfacher durch strncpy ersetzen. Da brauchst du den Substring nicht.

    Super, danke, die kannte ich noch nicht 🙂


Log in to reply