Hallo Martin,
Quote:
Wie schön, dass sich mal jemand mit Pointern und ihren Tücken auskennt... Meist versteht mich keiner, wenn ich von so etwas rede
|
Na ja, wer die nach einigen Jahren Programmieren in C und C++ nicht kennt sollte sich ganz dringend einen anderen Job suchen;-)
Quote:
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:
Also einfach durch das Abspeichern der Adresse. Schon diese Zeile führte zum Crash und das hatte mich überrascht.
|
Das ist dann allerdings merkwürdig! Das einzige, was mir spontan einfällt ist eine obskure Ecke des C-Standards, die besagt, dass allein schon die Verwendung eines Pointers auf ein nicht mehr existierenden Objekt undefined behaviour hervorruft. Damit ist tatsächlich bereits so etwas scheinbar harmloses wie
Code:
int * p = malloc( 10 );
free( p );
printf( "%p\n", ( void * ) p );
im Prinzip nicht koscher (der Aufruf von free() kann aus der im Pointer gespeicherten Addresse - ohne diese zu ändern! - eine sogenannte "trap representation" machen). Ich habe allerdings noch nie eine Plattform gesehen, bei der dies tatsächlich zu Problemen führte - aber vielleicht sind die ARM-Architekturen ja das erste Beispiel. Das würde aber gleichzeitig erfordern, dass GetFont() einen ungültigen Pointer zurückliefert - was wiederum der Fall sein könnte, wenn sie einen Pointer auf eine lokale (non-static) strucure oder einen lokalen scoped_ptr zurückgibt und da jemand nicht auf die Compiler-Warnungen gehört hat, dass das unsinnig ist. Aber das sind natürlich alles nur wilde Spekulationen...
Quote:
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).
|
Ich vermute, du denkst da z.B. an automatische Übersetzungen. Aber in dem Fall macht das wenig Sinn, da aus dem 'text' Pointer nicht ersichtlich ist, wieviel Speicher für den String zur Verfügung steht und man sich nur am '\0' am Ende orientieren kann, d.h. der übersetzte Text dürfte nie länger sein als der Originaltext. Und den 'text' Pointer auf was anderes umzubiegen ist ja auch dann kein Problem, wenn es ein 'char const *' ist - das wäre es nur bei einem 'char * const'. Ich vermute, dass dem Autor der Unterschied zwischen den beiden nicht so ganz klar war und er/sie deshalb das 'const' lieber ganz weggelassen hat;-)
Freundliche Grüße, Jens