String & Left



  • Hallo,

    ich habe eine eigene String-Klasse. Nun bin ich gerade dabei Left(n) zu implementieren.
    Brauche euren Rat. Was ist jetzt besser?

    DT_String*	DT_String::Left(int n)
    {
    
    	string str = mpsString;
    	string sub_str = str.substr(0, n);
    
    	DT_String *ergebnis = new DT_String(sub_str.data());
    
    	return ergebnis;
    }
    

    oder

    DT_String	DT_String::Left(int n)
    {
    
    	string str = mpsString;
    	string sub_str = str.substr(0, n);
    
    	DT_String ergebnis = DT_String(sub_str.data());
    
    	return ergebnis;
    }
    

    Merci



  • Zweiteres.
    Bei deiner ersten Lösung wäre der Aufrufer dafür verantwortlich den String freizugeben. Memoryleaks wären vorprogrammiert.
    Kurt



  • Um unnötiges Kopieren zu vermeiden, einfach

    DT_String    DT_String::Left(int n)
    {    
        return DT_String(mpsString.substr(0, n).c_str());
    }
    

    Statt 'data()' sollte man 'c_str()' verwenden, um einen nullterminierten C-String zu erhalten ('data()' liefert nur den Zeiger auf den Buffer, der nicht unbedingt nullterminert sein muß, sonst mußt du einen Konstruktor (const char *, size_t) verwenden (Aufruf dann mit DT_String(s.data(), s.length()); ).



  • Th schrieb:

    Statt 'data()' sollte man 'c_str()' verwenden, um einen nullterminierten C-String zu erhalten

    Nein, besser nicht. c_str ist lediglich ein Hintertürchen und nicht für die normale Arbeit mit std::string gedacht.

    Th schrieb:

    'data()' liefert nur den Zeiger auf den Buffer, der nicht unbedingt nullterminert sein muß

    Und wozu sollte Tanzfreak einen nullterminierten Buffer brauchen?


Anmelden zum Antworten