Как это возможно, что доступ к nullptr работает?

У меня есть простой класс:

class B
{
public:
    int getData() { return 3; }
};

затем я инициализирую указатель на него с помощью nullptr:

B *foo{ nullptr };

И тогда, пытаясь использовать это приходит сюрприз:

int t = foo->getData();

и т теперь 3. Как это возможно без построения класса? Это потому, что getData() не использует "this"? Это сломало все мои знания об указателях.

Это ожидаемое поведение? Я работаю в Visual Studio 2013.

3 ответа

Решение

Это ожидаемое поведение?

Нет, это UB, все возможно.

Это потому, что getData() не использует "this"?

Да, это может сработать, потому что this не будет использоваться в особом случае, но ничего не гарантировано.

Это неопределенное поведение, поэтому вы действительно должны быть очень напуганы.

Это может произойти, очевидно, что-то сделать (на вашей реализации C++), потому что getData функция не является виртуальной и не использует ни одного члена B, Таким образом, сгенерированный код не разыменовывает нулевой указатель.

Это неопределенное поведение, вы обращаетесь к методу-члену из nullptr, Никакое конкретное поведение или результат не будут определены.

В этом случае, хотя; дано ( cppreference):

Ключевое слово this является выражением prvalue, значением которого является адрес объекта, для которого вызывается функция-член.

Так как NULL ценность this не является разыменованием - метод-член не является виртуальным и не имеет доступа к данным члена this - это, кажется, работает.

Другие вопросы по тегам