Quote:
Quote:
Irgendwie erinnere ich mich, dass wegen falschem Umgang mit Fonts ich erst viele Abstürze hatte. Hier ein entsprechender Kommentar aus meinem PBChord-Programm:
Code:
//ifont *vorher = GetFont(); //I wanted to save actual font during examining width
//But storing the result of GetFont() crashes on real device (not in Emulator)
Versuche also niemals, den Rückgabewert von GetFont abzuspeichern! Das Gibt sofortigen Absturz auf PB903/603 aber nicht auf dem Emulator...
Das wundert mich eigentlich nicht so sehr, ein so zurückgegebener Pointer ist in aller Regel nur solange gültig, bis die Funktion das nächste Mal aufgerufen wird. Wenn man die Informationen, auf die ein solcher Pointer zeigt, später noch braucht, muss man immer eine "deep copy" machen. Dass sich das Verhalten auf dem Gerät und dem Emulator unterscheidet könnte an unterschiedlichen memory allocation Strategien liegen sofern der Pointer nicht z.B. auf eine als in der GetFont() Funktion als static definierte structure zeigt (in dem Fall würde ich dann aber eher erwarten, dass die Verwendung eines "alten" Pointers nicht zu Abstürzen führt, sondern nur zu scheinbar unsinnigen Inhalten).
|
Wie schön, dass sich mal jemand mit Pointern und ihren Tücken auskennt... Meist versteht mich keiner, wenn ich von so etwas rede
Für mich wäre es eigentlich auch keine Überraschung gewesen, dass man sich auf den zurückgegebenen Wert nicht verlassen darf.
Aber der Absturz passierte (glaube ich) überraschenderweise nicht beim
Benutzen des zurückgegebenen Pointers, sondern direkt schon in der Zuweisungszeile:
Code:
ifont *vorher = GetFont();
Also einfach durch das Abspeichern der Adresse. Schon diese Zeile führte zum Crash und das hatte mich überrascht.
Möglicherweise arbeitet GetFont() intern mit einer Referenzverwaltung, die das Eigentum am Speicher, auf den der Zeiger zeigt bei der Zuweisung abgibt, so dass dann GetFont und seine Kollegen intern nichts mehr zu bestellen haben.
Es gibt ja solche "ScopedPointer" und andere Schweinereien...
Die Sache mit dem char * im imenu könnte ja auch darauf hinweisen, dass der Member "text" nicht nur als Eingabe gedacht ist, sondern auch veränderlichen Text enthalten kann (wer auch immer den dann nachträglich verändern können sollte).