|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|||||||||||
О вызове функций классов27.10.2011, 12:00. Показов 1512. Ответов 14
Метки нет (Все метки)
Здравствуйте, товарищи!
У меня возник вопрос, почему работает данный код:
сохраняется возможность вызвать функцию my. Вероятно, функции в объектах вызываются каким-то странным образом?
0
|
|||||||||||
| 27.10.2011, 12:00 | |
|
Ответы с готовыми решениями:
14
Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Несовпадение типов данных при вызове функций |
|
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,299
|
|
| 27.10.2011, 12:43 | |
|
delete не удаляет объекты (переменные), а просто помечает занимаемую ими память как "свободно".
1
|
|
|
23 / 23 / 4
Регистрация: 05.11.2010
Сообщений: 134
|
|
| 27.10.2011, 12:45 | |
|
1
|
|
|
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,299
|
||
| 27.10.2011, 12:59 | ||
|
1
|
||
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
| 27.10.2011, 14:43 [ТС] | |
|
Я понимаю, что delete не удаляет объект,
мне интересно почему после изменения значения указателя (т.е. a указывает на другой адрес в памяти) все равно запись a->my(0) работает нормально. Т.е. получается, что компилятор не обращает внимание на адреса, а тупо где видит конструкцию a->my(0) замещает ее на вызов нужной функции?
0
|
|
|
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,299
|
||
| 27.10.2011, 15:23 | ||
|
1
|
||
|
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
|
|
| 27.10.2011, 15:33 | |
|
и после delete, есле не ошибаюсь, желательно присвоить значение ноль. Так что б не появлялось мусора в памяти.
1
|
|
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
| 27.10.2011, 15:47 [ТС] | |
|
Ага, спасибо за пояснения! Посмотрел ассемблерный листинг - действительно компилятор подставляет адрес функции в место вызова (точнее адрес элемента таблицы, элемент которой содержит инструкцию jmp на начало функции).
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 27.10.2011, 16:25 | ||
|
В данном случае после присвоения указателю a нового значения при разыменовании этого указателя участок памяти, на который он указывает, интерпретируется как объект класса A, и, собственно, для этого объекта и вызывается функция my. Если тот мусор, который хранится на месте этого "объекта", способен выполнить его роль, то все пройдет нормально. Если же вы, например, объявите функцию my виртуальной, то все пройдет не так гладко.
2
|
||
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
||||||
| 27.10.2011, 17:28 [ТС] | ||||||
|
Mr.X, я имеел ввиду, что компилятор не использует адрес объекта для вычисления местоположения функции в памяти (это наглядно демонстрируется возможностью вызова функции после установки указателя на другой адрес.
В дизассемблере это выглядит примерно так:
0
|
||||||
|
Заблокирован
|
||
| 27.10.2011, 19:10 | ||
|
Для всех объектов вашего класса имеется лишь одно определение ФУНКЦИИ void my(int a). Причем, так как эта функция определяется внутри тела класса, то она является встраиваемой, и код ее определения компилятор поместил во все места, где вы эту функцию вызываете. То есть это сделано компилятором еще до выполнения вашей программы. В чем разница вызова этой функции -члена класса, от обычной функции? Разница состоит лишь в том, что функции - члену класса передается неявно дополнительный первый параметр, который является указателем на объект вашего класса и носит название this. Так что компилятору совершенно без разницы, удалили вы объект, или нет, он вставляет в код вызов этой функции и передает ей в качестве первого параметра значение вашего указателя a. Как вы сами можете видеть из вывода вашей программы, сам указатель a никуда не делся! Его время жизни соотвентсвует телу функции main, в которой он, как локальная переменная, объявлен. Так что компилятору всегда известен адрес a. В вашем случае, судя по выводу программы, его адрес равен 0012FF54. Поэтому компилятор просто при вызове функции my в качестве первого неявного параметра, соответствующего this передает то значение, которое хранится в a. С этим параметром, то есть со значением, хранящемся в a, вы в функции my не работаете. Поэтому и никаких ошибок и не возникает!
2
|
||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||||
| 27.10.2011, 19:45 | ||||||||
|
Пример:
1
|
||||||||
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
||||||
| 28.10.2011, 09:52 [ТС] | ||||||
|
Mr.X, логика в том, что если бы компилятор использовал адрес объекта при вызове функции, то при изменении указателя не удалось бы вызвать данную функцию.
Ну а выводы элементов остались после модификации примера (раньше там еще были куски кода) Вообще, спасибо за объяснения!!! ) Добавлено через 13 часов 28 минут Сыроежка, спасибо за объяснения. Только в данном случае компилятор почему-то не встроил функцию в место вызова (судя по сгенерированному ассемблерному листингу). Интересно, почему?
0
|
||||||
|
Заблокирован
|
||
| 28.10.2011, 21:29 | ||
|
Но я смотрю код и не могу понять, а та ли эта функция? То есть в теле функции в цикле 81 раз записывается какое-то слово в область памяти
0
|
||
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
| 29.10.2011, 16:52 [ТС] | |
|
Сыроежка, функция та, не сомневайтесь.
Просто компилятор от Майкрософт вставляет такую вещь перед каждой функцией. Мне тоже не совсем понятно зачем (кстати, копирует он инструкцию int 3), но скорей всего для защиты стека или что-то подобного. Может кто-нибудь в курсе, зачем?
0
|
|
| 29.10.2011, 16:52 | |
|
Помогаю со студенческими работами здесь
15
Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? Объясните, пожалуйста, как работает передача переменных при вызове функций?
Где ошибка в вызове функций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|