Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему обращение к методу работает для nullptr ? 
:(
    Опции темы
admsasha
Дата 21.9.2021, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Есть вот такой код

Код

#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


Почему???
PM MAIL WWW ICQ Jabber   Вверх
_zorn_
Дата 22.9.2021, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



И правда дичь какая то.
Более того если заменить присваивание на что то вроде 
Код

a *test = (a*)123;

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

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

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

Это сообщение отредактировал(а) _zorn_ - 22.9.2021, 16:47
PM MAIL   Вверх
_zorn_
Дата 22.9.2021, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



PM MAIL   Вверх
xvr
Дата 22.9.2021, 19:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
_zorn_
Дата 25.9.2021, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



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

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

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

Это сообщение отредактировал(а) _zorn_ - 25.9.2021, 15:55
PM MAIL   Вверх
xvr
Дата 28.9.2021, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

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

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

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

PM MAIL   Вверх
_zorn_
Дата 1.10.2021, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



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


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

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

Это сообщение отредактировал(а) _zorn_ - 1.10.2021, 19:45
PM MAIL   Вверх
_zorn_
Дата 1.10.2021, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



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

Ясно понятно. А если "случайно" ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1268 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.