Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Почему обращение к методу работает для nullptr ?


Автор: admsasha 21.9.2021, 14:41
Есть вот такой код

Код

#include <iostream>

using namespace std;

class a {
public:
    int get (){
        return 2;
    }
};

int main (){

  a *test = nullptr;
  cout << test->get () << endl;

  return 0;
}


Вывод
Код
2



Проверял на https://www.onlinegdb.com/online_c++_compiler


Почему???

Автор: _zorn_ 22.9.2021, 16:39
И правда дичь какая то.
Более того если заменить присваивание на что то вроде 
Код

a *test = (a*)123;

оно так же отработает.

Какие то внутренние "оптимизации" наверное. Видимо НАВЯЗЧИВОЕ выпрямление дробовика направленного в ногу.
Скорей всего зависит от компилятора (g++ выпрямляет)

PS. А кто то еще php ругает )

Автор: _zorn_ 22.9.2021, 18:47
https://medium.com/@7zorn7/you-never-know-result-of-c-program-cd41e11c7207

Автор: xvr 22.9.2021, 19:57
Цитата(admsasha @  21.9.2021,  14:41 Найти цитируемый пост)
Почему??? 

А почему бы и нет? Внутри get() значение this будет nullptr. Но так он и не используется - всё ок
Проблемы будут если вы полезете за данными класса или попытаетесь вызвать виртуальный метод - тогда всё навернётся

Автор: _zorn_ 25.9.2021, 11:36
Нормальный человек ждет что `null->something` есть обращение к нулевому указателю и все должно упасть уже сейчас.
Курильщики же считают нормальным, то что можно составить некорректную программу и она не будет падать  smile 
Я сам курильщик (php), но даже там такой дичи нет.

Если бы метод хотя бы статическим был, я бы еще понял.

PS. Подсказать сколько "неуловимых" ошибок можно насобирать когда иногда приходит null ? А если "обычно" не падает ?

Автор: xvr 28.9.2021, 11:02
Цитата(_zorn_ @  25.9.2021,  11:36 Найти цитируемый пост)
Нормальный человек ждет что `null->something` есть обращение к нулевому указателю и все должно упасть уже сейчас.

В С никто никому ничего не должен  smile Обычный UB

Цитата(_zorn_ @  25.9.2021,  11:36 Найти цитируемый пост)
Курильщики же считают нормальным, то что можно составить некорректную программу и она не будет падать

Некорректная программа имеет право вести себя как ей вздумается - падать или работать, например по фазам луны  smile 

ТС спрашивал, почему не упало - я ответил. Можно ли на это закладываться? Нет.

Автор: _zorn_ 1.10.2021, 19:29
Цитата(xvr @  28.9.2021,  18:02 Найти цитируемый пост)
В С никто никому ничего не должен  smile Обычный UB


Дело в том что в С это бы упало если бы там были классы и объекты. Обычное обращение к невыделенной памяти... 
Вы же имели ввиду C++ ?
В С компилятор не станет выделять память в итоговом бинарнике, если ты указал что переменная должна равняться null без явного malloc и т.п.

Это не UB, а тупая хрень. Нет ни new и ничего подобного.

Автор: _zorn_ 1.10.2021, 20:32
Цитата(xvr @  28.9.2021,  18:02 Найти цитируемый пост)
Можно ли на это закладываться? Нет.

Ясно понятно. А если "случайно" ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)