Как это возможно, что доступ к 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
- это, кажется, работает.