Crash bei string("text hier")



  • Nicht in meinem Beispiel aber in seinem Code.



  • HighLigerBiMBam schrieb:

    Nicht in meinem Beispiel aber in seinem Code.

    Wo genau? Welchen Fehler macht er? Was soll er tun, um ihn zu vermeiden?
    Selbst ich sehe nicht, welchen Ansatzpunkt Du uns zeigen wolltest oder was Du als Fehlerursache herausgefunden hast.



  • Wo habe ich gesagt das er damit einen Fehler gemacht hat? War nur ein Reminder..



  • Was mir als erstes auffällt: was ist xmlChar? vermutlich KEIN char, oder? Damit übergibst du dem Ctor von std::string eine char-Sequenz die in Wirklichkeit keine ist. Das kann nur in die Hose gehen.



  • crashkurs schrieb:

    string to_str(const xmlChar* xml_string) {
        return result(reinterpret_cast<const char*>(xml_string));
    }
    

    Ja, sieht scheußlich aus. Was weiß man denn über xmlChar ? Erzähl mal.

    crashkurs schrieb:

    Was jetzt passiert ist, dass irgendwann im x'ten Aufruf (x < 30) dieser Funktion
    der Konstruktor von string eine Exception wirft.
    [...]
    Offensichtlich kann er keinen Speicher allozieren, aber warum? Soviel verbrauch
    ich nicht, dass der voll sein könnte und malloc / operator new will doch
    auf den Heap?

    Tja. Kann man -- aufgrund der wenigen Informationen -- nur raten. Auch wenn ich eine Idee habe, woran es liegen könnte, würd ich mir von Dir doch lieber erst erklären lassen, was xmlChar sein soll.



  • So what is this funky "xmlChar" used all the time?
    It is a null terminated sequence of utf-8 characters. And only utf-8! You need to convert strings encoded in different ways to utf-8 before passing them to the API. This can be accomplished with the iconv library for instance.

    Ich kann garantieren, dass in der parsierten xml nur ASCII-Subset von utf-8 ist.

    Geschieht dir recht, wenn solcher Code fehlschlägt 😉

    Ich weiß, ich weiß. Ich habe aber bevor ich gefragt habe, folgendes probiert:
    Genau den Konstruktoraufruf, der immer auf die Bretter geht, durch
    eine If-Anweisung ausklammern und stattdessen return string("peterpan").
    Gleicher Fehler. Ich dachte daher, dass es zumindest nicht am cast liegt.

    Warum nicht den Iterator-Konstruktor von std::string nehmen, der die Range zeichenweise kopiert? Dann wird nämlich jedes Zeichen und nicht der Zeiger auf die Zeichenkette gecastet.

    Kopiert nicht string(const char*) auch den Speicherbereich?

    Danke schon mal für die vielen Antworten.



  • Kannst du mal ein vollständig funktionierendes Beispiel schrieben, dass den Fehler reproduziert?



  • Crashkurs schrieb:

    Ich habe aber bevor ich gefragt habe, folgendes probiert:
    Genau den Konstruktoraufruf, der immer auf die Bretter geht, durch
    eine If-Anweisung ausklammern und stattdessen return string("peterpan").
    Gleicher Fehler.

    Du hast dir möglicherweise schon vorher den Heap zerlegt.



  • MFK schrieb:

    Du hast dir möglicherweise schon vorher den Heap zerlegt.

    Jup. Sieht sehr danach aus.
    Vorgehen: reduziere den Code immer weiter, vor allem die Aufrufe davor sollten soweit möglich auskommentiert werden und Schritt für Schritt durch dummies ersetzt werden. Sobald der Fehler verschwindet hast du den Code auskommentiert, der den Fehler verursacht (hoffentlich).



  • Danke für eure Hinweise. Ich schau mal.


Anmelden zum Antworten