string und char*



  • zu jedem new[] gehört ein delete[] sonst gibts memoryleaks

    Danke, mach ich 🙂

    wenn options[0] char verlangt benutz doch path.c_str()!

    Das benutz ich ja im strcpy. Wenn ich direkt schreibe:

    options[0].optionString = path.c_str();
    

    erhalte ich folgende Fehlermeldung:

    error C2440: '=' : cannot convert from 'const char *' to 'char *'
    


  • kp schrieb:

    ...Meine Frage ist nun ob das elegant ist (z.B. ...=new char...), oder ob es eine bessere Lösung dazu gibt.
    Danke und Gruß

    Hi,

    ich finde das genau richtig (elegant und gut).
    IMO ist das genau der Weg, wenn man Daten aus einen std::string einer C-Schnittstelle als non-const-char übergeben muss.
    c_str() alleine reicht nicht, wenn die Schnittstelle (hier JavaVMOption::optionString) die Daten ändern (oder sich zumindestens nicht auf const festlegen) will.

    Willst Du hinterher mit den Daten weiterarbeiten, musst Du sie natürlich wieder explizit übernehmen

    path = options[0].optionString;
    

    BTW: Einige finden die "+-Schreibweise" eleganter als das append():

    string path = "-Djava.class.path=";
    path += jpath;
    

    aber in dem Fall ist das Geschmackssache.

    Gruß,

    Simon2.



  • was sagt denn die beschreibung zu dem options ???



  • options[0].optionString möchte nen const char* haben...



  • sorry natürlich ohne const,
    möchte also nur einen char* haben



  • mh sorry schlecht formuliert, wie lange muss der string denn in options stehen? weil wenn du das delete[] zu früh aufrufst gehts eventuell später schief ?!



  • Das options wird nur einmal für einen Methodenaufruf gebraucht. Gebe es jetzt einfach am Ende meiner Methode wieder frei.
    Danke für eure Tipps!



  • kp schrieb:

    options[0].optionString = new char[path.length()];
    

    Du hast hier ein Zeichen zu wenig reserviert. C-Strings enden immer mit einem Nullzeichen, für das natürlich auch Speicher bereitgestellt werden muss. strcpy fügt dieses Zeichen beim Kopieren immer automatisch dem Zielstring an. Die Funktion weiss aber nicht, ob genügend Speicher vorhanden ist, und überschreibt uU andere Bereiche, was zu undefiniertem Verhalten führt.



  • Wo wir schon bei Strings sind:

    in welcher C++ Bibliothek (hoffentlich in der Standatbibliothek) und wie heißen die Funktionen um aus einem String nur Teile herauszulesen?
    Z.B. eine Funktion wie "GetPartString(string str, int start, int end)" mit der man den TeilString von 'start' bis 'end' herauslesen kann!

    Kennt da jemand was? 😕
    (In meinem Buch "C++ Intensivkurs" wurde da nähmlich noch nicht näher drauf eingegangen!)



  • Ja gibts, die Methode nennt sich "substr", und du findest sie (und andere nuetzliche String-Funktionen) hier erklaert: http://cppreference.com/cppstring/index.html



  • Cool! Danke! 😃


Anmelden zum Antworten