Wann kommt den Aufruf einer member-Funktion auf eine null-Instanz nicht definiertes Verhalten zur Folge?

Betrachten Sie den folgenden code:

#include <iostream>

struct foo
{
    //(a):
    void bar() { std::cout << "gman was here" << std::endl; }

    //(b):
    void baz() { x = 5; }

    int x;
};

int main()
{
    foo* f = 0;

    f->bar(); //(a)
    f->baz(); //(b)
}

Erwarten wir (b) zum Absturz bringen, da es kein entsprechendes Mitglied x für den null-Zeiger. In der Praxis (a) nicht Abstürzen, weil die this Zeiger nie benutzt.

Weil (b) dereferenziert die this Zeiger ((*this).x = 5;), und this null ist, wird das Programm in undefiniertem Verhalten, wie die Dereferenzierung von null ist immer gesagt zu undefiniert Verhalten.

Tut (a) nicht definiertes Verhalten zur Folge? Was ist, wenn beide Funktionen (und x) sind statisch?

Wenn beide Funktionen static, wie könnte x bezeichnet werden innerhalb von baz? (x ist eine nicht-statische member-variable)
Vorgeben x gemacht wurde, auch statisch. 🙂
Sicherlich, aber für den Fall (a) es funktioniert auf die gleiche in allen Fällen, ich.e, wird die Funktion automatisch aufgerufen. Allerdings, und ersetzen Sie den Wert des Zeigers, der von 0 bis 1 (z.B. durch reinterpret_cast), ist es fast ausnahmslos immer abstürzt. Auch der Wert Zuweisung 0 und somit NULL, wie im Fall a stellt etwas besonderes an den compiler ? Warum muss es immer Abstürzen, mit einem anderen Wert zugewiesen?
Interessant: Kommt die nächste revision von C++, es darf nicht mehr dereferenzieren von Zeigern an alle. Wir sind jetzt führen Sie indirection über Zeiger. Um mehr zu erfahren, führen Sie bitte Umweg über diesen link: N3362
Aufruf einer member-Funktion einen null-Zeiger ist immer undefinierten Verhalten. Einfach durch einen Blick auf deinen code, ich kann bereits spüren, das Undefinierte Verhalten langsam kriecht meinen Hals!

InformationsquelleAutor GManNickG | 2010-03-18

Schreibe einen Kommentar