Casten von void*, Vergleich von void*

02/02/2015 - 03:12 von Jens Müller | Report spam
Folgender Beispielcode:

class A {
public: A() {}
};

class B {
public; B() {}
};

A* a = new A();
B* b = new B();

void *aVoid = a;
void *bVoid = b;

bool compareVoid = (aVoid == bVoid); // (1) false?

B* aCastedToB = static_cast<B*> aVoid;
bool compareB = (aCastedToB == b); // (2) false oder unspecified?

Ich habe leider nur ISO/IEC 14882:2003 hier. Vielleicht kann mir jemand
bestàtigen, ob das, was ich aus dem Standard herauslese, damals so galt
und vor allem immer noch so gilt.

Zu (2): Abschnitt 5.2.9 [expr.static.cast], Absatz 10 sagt, dass man
pointer to cv1 void in einen beliebigen pointer to cv2 T konvertieren
kann (mit cv2 >= cv1). Bei einer Konvertierung eines Pointers auf void*
und wieder zurück auf den ursprünglichen Typ kommt dann der
ursprüngliche Wert heraus. Verstehe ich es richtig, dass der Standard es
offen làsst, was passiert, wenn der Zieltyp _nicht_ der ursprüngliche
Typ ist? Insbesondere: Ist irgendeine Aussage darüber möglich, was bei
einem Vergleich eines solcherart erhaltenen Pointers mit einem
"richtigen" Pointer dieses Typs herauskommt?

Zu (1): Zu Pointer-Vergleichen sagt Abschnitt 5.9 [expr.eq]: "Two
pointers of the same type compare equal if and only if they are both
null, both point to the same function, or both represent the same
address (3.9.2). Das garantiert mir, dass bei dem Vergleich false
herauskommt, oder?

Danke und Gruß,

Jens
 

Lesen sie die antworten

#1 Juergen Ilse
02/02/2015 - 09:55 | Warnen spam
Hallo,

Jens Müller wrote:
Bei einer Konvertierung eines Pointers auf void* und wieder zurück auf
den ursprünglichen Typ kommt dann der ursprüngliche Wert heraus. Verstehe
ich es richtig, dass der Standard es offen làsst, was passiert, wenn der
Zieltyp nicht der ursprüngliche Typ ist?



IMHO ja. Es waere sogar denkbar, dass eine solche Konvertierung zum Programm-
abbruch fuehrt (wenn der Wert des Pointers z.B. wegen falschem Alignment fuer
den Zieltyp kein gueltiger Wert eines Pointers fuer den Zieltyp waere).
Bei der Konvertierung zu void* und zurueck zum urpspruenglichen Typ ist ge-
waehrleistet, dass genau das (illegaler Wert fuer den Zieltyp) nicht passiert,
bei anderem Zieltyp ist das nicht unbedingt gewaehrleistet (und ja, allein
das erzeugen eines ungueltigen Pointerwertes kann auf manchen Architekturen
schon zu einer Exception fuehren, nicht erst der Zugriff ueber den Pointer).
IMHO gilt das nicht nur fuer C++ sondern auch fuer C in gleicher Weise.

Tschuess,
Juergen Ilse ()
Ein Domainname ist nur ein Name, nicht mehr und nicht weniger.
Wer mehr hineininterpretiert, hat das Domain-Name-System nicht
verstanden.

Ähnliche fragen