Evgenii Legotckoi
21 липня 2020 р. 12:31

Виклик методу на nullptr

Розберемо невеликий приклад коду, коли викликається метод у об'єкта, який инициализирован nullptr .


Приклад коду

Нам дано наступний програмний код.

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct X
  6. {
  7. X* self()
  8. {
  9. cout << "call method of nullptr" << endl;
  10.  
  11. if (!this)
  12. {
  13. cout << "object does not exist" << endl;
  14. return nullptr;
  15. }
  16.  
  17. cout << "object exist" << endl;
  18. return this;
  19. }
  20. };
  21.  
  22. int main()
  23. {
  24. X* x = nullptr;
  25. if (x->self())
  26. {
  27. return 0;
  28. }
  29.  
  30. return 0;
  31. }
  32.  

Пояснення

Як ви думаєте, впаде чи програма в даному випадку? А якщо ні, то що буде виведено в консоль?

Як правило програма в більшості випадків падати не буде. Але це невідомий. Даний код є прикладом невизначеного поведінки, тобто Undefined Behaviour . Поведінка програми буде визначатися внутрішньою реалізацією компілятора і не дасть гарантованого результату. Тобто падіння програми і справний виконання програми є рівнозначно правильними відповідями.

Що ж станеться в разі справного функціонування програми?

Відповідь: В консоль буде виведено наступне повідомлення

  1. call method of nullptr
  2. object does not exist

Тобто метод виконається як статичний метод, як якщо б ми зверталися до статичного методу класу. Це можливо за рахунок того, що відомий тип об'єкта, сигнатура та реалізація викликається методу. При цьому не виконується звернення до внутрішнім змінним класу. А перевірка на this дозволяє упевнитися, чи існує об'єкт. Також можна обійтися і без цієї перевірки, код все одно буде виконуватися так доти, поки не зустрінеться частина коду, яка вимагає створеного об'єкта.

Висновок

Проте даний код є прикладом невизначеного поведінки - Undefined Behaviour . Тому такі фокуси вкрай не рекомендуються при розробці програмного забезпечення. Оскільки навіть якщо зараз код працює, то в наступній версії компілятора це може перестати працювати. Тому кілька разів подумайте, перш ніж таке писати.

По статті запитували0питання

1

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…