Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724

Вызов метода класса через указатель на ноль

18.05.2015, 07:55. Показов 1790. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct A
{
    int a;
    void set(int n)
    {
        a = n;
    }
};
 
struct B
{
    A* pA;
    
    void start()
    {
        pA = nullptr;
 
        int a = 1;
        
        pA ->set(a); // почему здесь не возникает ошибка?
    }
};
 
int main()
{
    B b;
    b.start();
    
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2015, 07:55
Ответы с готовыми решениями:

Вызов метода производного класса через указатель на базовый класс
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c->fnz() ...

Универсальный вызов метода через указатель на объект
Никак не могу найти универсальную конструкцию, которая позволяла бы вызывать любой метод класс, с любыми параметрами через указатель на...

Вызов метода потомка через указатель на родителя
Всем доброго времени суток, никак не придумаю, как провернуть такое: Пишу простенькую игру на cocos2dx. Есть первый класс, CNode - он...

8
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
18.05.2015, 08:04
Цитата Сообщение от nord_v Посмотреть сообщение
pA ->set(a); // почему здесь не возникает ошибка?
Потому что функция класса существует и без объекта класса, а вот переменные класса без объекта не существуют. Как только пытаются обратиться к объектам типа pA ->a, вот тут и получается облом.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.05.2015, 08:11  [ТС]
Цитата Сообщение от Enno Посмотреть сообщение
Потому что функция класса существует и без объекта класса, а вот переменные класса без объекта не существуют.
Логично, но есть и другая логика: нестатический метод класса может вызвать только объект класса, а где здесь объект, если указатель на ноль?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.05.2015, 08:19
Лучший ответ Сообщение было отмечено nord_v как решение

Решение

nord_v, наличие указателя и вообще синтаксиса ptr->func подразумевает наличие объекта, на который этот указатель ссылается. А вот то, что у тебя там ноль и ты пытаешься вызвать функцию, то это Undefined Behaviour. Обычно программа в таких ситуациях просто падает. Но вот у тебя не упала, считай, что тебе повезло. Писать код, который как-то это использует в работе - не надо.

Добавлено через 2 минуты
nord_v, вот еще чуть информации по теме.
1
18.05.2015, 08:22

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
считай, что тебе повезло
:yahoo: Везёт же некоторым )

0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
18.05.2015, 08:24
nord_v, неопределённое поведение. Чтобы вызвать нестатический метод класса, указатель придётся разыменовать. Поведение программы по достижении этой строки неизвестно.
1
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.05.2015, 08:26  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Писать код, который как-то это использует в работе - не надо.
Я так никогда и не пишу. Этот код я написал в 10-й студии, чтобы здесь привести для примера. Дали мне код посложнее (проект для 13-й студии), чтобы разобраться почему там возникает ошибка, и вот там, через отладчик, я увидел такой вызов метода. Проверил в 15-й, в 10-й, в mingw 4.7.1, везде всё одинаково: ошибка возникает не при вызове метода, а уже в самом методе. Поэтому и решил здесь спросить, что за чудеса.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.05.2015, 08:35
Цитата Сообщение от nord_v Посмотреть сообщение
Поэтому и решил здесь спросить, что за чудеса.
Ну, так называемый метод, обычно реализуется как функция с неявным первым параметром-указателем на объект (this). Поэтому, если "адрес" функции известен на этапе компиляции, то такой вызов сам по себе может не приводить к падению (но он не перестает являться UB при этом). Падение происходит при обращении к данным (т.е. уже внутри метода). Однако, если "адрес" метода не известен, то падение будет уже при вызове (например, если функция виртуальная).
2
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
18.05.2015, 12:05
Фактически краш возникает из-за ошибки доступа к памяти. Функция не виртуальная, потому и не встроен код поиска нужной функции (для которого надо реальный объект). Вот если объявить виртуальной, то рухнет там. Проверено на MSVS2005.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2015, 12:05
Помогаю со студенческими работами здесь

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Почему не возвращается значение через указатель из метода класса?
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода из метода, указатель не указывает на...

Указатель метода класса в другом методе этого класса
Здравствуйте. Как можно передать в методе класса указатель на другой метод этого же класса. Задача сделать вот что: class A { ...

Указатель на метод класса в качестве аргумента метода класса
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Вызов метода класса из метода другого класса
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru