Почему можно обратиться к объекту через указатель со значением nullptr?

#include <iostream>
#include <memory>
 
class Printer
{
public:
  void print(std::string text)
  {
    std::cout << text << std::endl;
  }
};
 
int main()
{
  auto printer1 = std::make_unique<Printer>();
  std::unique_ptr<Printer> printer2 = std::move(printer1);
 
  if (printer1 == nullptr) {
    printer1->print("Printer1 is null!"); 
  }

  return 0;
}


g++ -std=c++17

При запуске программа выводит "Printer1 is null!".
Как такое может быть?
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Метод класса под капотом - это функция, котрой помимо прописанных параметров передается указатель на объект. В вашем случае передается nullptr. Но сама функция не обращается к объекту, да у него и членов-то с данными никаких нет. Поэтому все более менее работает. Но это UB и могло и не повезти. Из-за оптимизаций компилятор мог бы что-то сломать.

P.s. сказанное выше не относится к виртуальным функциям. Там указатель на функцию храниться в vtable в экземпляре класса и вызов через nullptr скорее всего упадет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы