|
|
|||||||||||
[C++] Взятие адреса конструктора. Физическое время существование объекта.16.02.2012, 15:40. Показов 15583. Ответов 69
Метки нет (Все метки)
1. конструктор.
поэтому обращаюсь к тебе Evg как к очень опытному специалисту знающему "нутро". вот мы сделали бинарник. в нем программа, в ней создаются объекты классов. мне сложно судить где буду лежать эти объекты, предположу что в .text если мое предположение верно, то после отображения в память, можно будет обратится к конструктору зная его адрес, поскольку никакие высокоуровневые вещи не будут мешать. вопрос 2
0
|
|||||||||||
| 16.02.2012, 15:40 | |
|
Ответы с готовыми решениями:
69
Взятие адреса у константной переменной при объявлении |
|
|
||||||
| 16.02.2012, 15:46 | ||||||
|
В личке ты вопрос ставил по другому. Просто сейчас повторю твой вопрос и ответ, который я написал, но не смог отправить. Если после этого тебе до сих пор не станет ясен ответ на вопрос 2 (уже из данной темы) - скажи. Про первый вопрос, как я уже писал, я вопроса не понял
Вопрос N2, как он был задан в личке второй момент на который хотелось бы твоих комментариев. время жизни авто переменных. каково оно? много раз написано на форуме что после выхода из области видимости и при отсутствии след вызовов - данные лежат нетронутыми. вопрос, какое количество последующих вызовов должно произойти чтобы данные затерлись, если данные эти - поля временного класса А, который создан и сразу уничтожен вначале моего письма. Ответ Я не знаю, насколько ты знаком с устройством файловой системы. Когда ты удаляешь файл на диске, то ты потом его можешь восставновить (если повезёт). Происходит это потому, что файл, как логическая сущность, из файловой системы на логическом уровне удаляется. Но физическое содержимое физического диска остаётся не тронутым. Удаляется только запись о том, что такой-то файл присуствует (именно поэтому после восстановления файлов у них нельзя восстановить оригинальное имя), но содержимое файла на диске остаётся, хотя это место отмечено как свободное. Если после удаления файла создать другой файл, то есть вероятность того, что данные от нового файла попадут на те же саме физические области физического диска и перетрут их (и тогда старый файл уже нельзя будет восстановить). С твоим вопросом про объекты - то же самое. Логическое время жизни автоматического объекта (которое гарантировано стандартом) - это от точки его объявления до закрывающей фигурной скобки в том блоке, в котором объявлена переменная. После того, как перешли закрывающую скобку, логичеси объект существовать перестаёт. Но содержимое объекта физически находится в той области памяти, где существовал объект. Если эта область памяти затем кем-то переиспользуется, то данные от объекта навечно утеряны, если память ещё не успела поиспользоваться, то физически сами данные можно получить
Ответ на вопрос "какое количество последующих вызовов должно произойти чтобы данные затерлись" нельзя дать однозначно. Это зависит от каждого конкретного случая и от того, каким образом компилятор распорядится стеком. Даные затрутся в тот момент, когда активация текущей функции наложится на интересующий тебя участок памяти и когда компилятор построит записи в эту память. В моём примере активации стека наложились, но в func2 из этой памяти я только читал, но не писал.
2
|
||||||
|
|
|
| 16.02.2012, 16:00 [ТС] | |
|
Evg, спасибо. ответ исчерпывающ.
первый вопрос разобъем. 1. указатель на объект указывает на что? на некую область памяти с которого стартует размещение объекта? если первой в объекте идет функция - конструктора, значит ли это что получая указатель на объект - мы получаем и адрес расположения конструктора?
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 16.02.2012, 16:17 | |
Сообщение было отмечено как решение
Решение
1. Да, указатель на объект указывает на некоторую область памяти, в которой размещен объект, - более детально, на первый (в традициях C/C++ правильнее, наверное, говорить "на нулевой") байт бинарного представления объекта.
2. Нет, независимо от наличия член-функций в объекте, этот указатель не указывает ни на конструктор, ни на какую-либо вообще член-функцию. Более того, Стандарт языка говорит, что указатель на конструктор получать вообще не следует. (Ну, ладно, уточню: хакерскими методами его получить можно, но вот что произойдет при попытке вызвать конструктор по полученному указателю - об этом Стандарт скромно умалчивает.)
3
|
|
|
|
|
| 16.02.2012, 16:22 [ТС] | |
|
CheshireCat, ну собственно об этом и шла речь.
найти его по смещению и вызвать. просто думалось что оно совпадать может с началом. но скорее всего вначале будут какие либо сигнатуры, может имя а может еще что
0
|
|
|
Заблокирован
|
|||||||||||||||||||
| 16.02.2012, 16:38 | |||||||||||||||||||
|
Рассмотрим код:
Рассмотрим другой пример:
Добавлено через 1 минуту
0
|
|||||||||||||||||||
|
|
|
| 16.02.2012, 17:01 [ТС] | |
|
Bers, ну в теории осмелюсь предположить что.
1. открываем исполняемый файл и ищем в тексте расположение искомого класса. запоминаем смещение относительно начала секции. далее смотрим смещение конструктора - чисто теоретически он будет первым после имен. затем загружаем файл в память (н-м способом) получаем адрес модуля процесса этого файла, прибавляем смещение до секции (пусть с кодом) + смещение до объекта + смещение до конструктора. далее пробуем запустить. процедура сходная с поиском функций в сторонней длл
0
|
|
|
|
|
| 16.02.2012, 18:33 | |
|
AzaKendler, по поводу того, на что указывает указатель на объект - посмотри код из первого поста В дизассемблерованном коде отсутствует позднее связывание. Оптимизация? правда тот код будет работать только в MSVS и только с вируатльными ф-циями (про другие компиляторы ни чего сказать не могу, т.е. не проверял) Но как пример сойдет)
0
|
|
|
|
|
| 16.02.2012, 18:54 [ТС] | |
|
Kastaneda, ну чтоб получился законченный пример я хочу попросить тебя дописать а что же получилось в результате настоящего позднего связывания. скинь плиз либо туда либо сюда
0
|
|
|
|
|||
| 16.02.2012, 19:22 | |||
|
Добавлено через 7 минут
0
|
|||
|
|
|
| 16.02.2012, 19:38 [ТС] | |
|
Evg, тогда поясни еще пожалуйста, куда в бинарном файле попадают методы объекта класса. они лежат отдельно от полей?
например у нас есть адрес начала "объекта" перемещаясь от этого начала мы находим..адрес? того где лежат его методы? поясни плиз.
0
|
|
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
| 16.02.2012, 19:42 | |
|
методы класса - обычные ф-ии со своей сигнатурой.
объект - кусок памяти с данными и никакие ф-ии в этом объекте не "лежат"
0
|
|
|
|
|
| 16.02.2012, 19:43 [ТС] | |
|
retmas, в бинарнике. имелся ввиду бинарник и его разделы.
в любом случае надо прояснить вопрос. как оно там расположено и вызывается. в секции кода точка входа в программу. там же видимо лежит и конструктор?
0
|
|
|
Заблокирован
|
||
| 16.02.2012, 19:49 | ||
|
Живут они в статической области памяти. И "выглядят" как самые обычные функции. После компиляции, вообще уже не существует никаких классов, и никаких экземпляров классов. Только боевой код самих функций, и память. Грубо говоря, исходный код вида: объект.Метод(); Преобразуется к виду Метод(this объекта);
0
|
||
|
|
|
| 16.02.2012, 19:53 [ТС] | |
|
Bers, ну понятно. важно понять теперь что куда попадает. если я правильно понимаю то все эти методы кучей попадут в секцию кода в бинарном файле. верно? возникает вопрос а сам класс будет трактован как просто набор данных? что же тогда будет его началом? на что мы возьмем указатель?
A* a = &A();
0
|
|
|
Заблокирован
|
|||
| 16.02.2012, 19:55 | |||
|
Никаких экземпляров классов, с его полями там нет. Добавлено через 1 минуту Результатом работы функции будит объект. Далее: &объект Результат работы - адрес объекта. Что не понятного?
0
|
|||
|
|
|||
| 16.02.2012, 20:04 [ТС] | |||
|
вопрос. получая указатель на созданный объект класса - получаем адрес чего? Добавлено через 2 минуты A* a = &A(); если на данные то в данных в бинарнике должен быть адрес того где искать конструктор. верно?
0
|
|||
|
Заблокирован
|
||
| 16.02.2012, 20:06 | ||
|
Указатель - это переменная, которая хранит адрес памяти. Получая указатель, который хранит адрес созданного объекта, ты получаешь адрес этого объекта. Адрес ячейки памяти, с которой начинается нулевой байт этого объекта.
0
|
||
|
|
||
| 16.02.2012, 20:10 [ТС] | ||
|
сформулируй однозначное определение плиз. это важно. например объект класса с++ на уровне бинарного файла это: поля объекта лежат в секции данных. методы в секции кода. в секции данных хранятся смещения до методов в секции кода. методы естественно на таком уроне есть функции. получая указатель на объект класса с++ мы получаем адрес некой сигнатуры (нулевой байт) этого класса в секции данных, далее подряд идут данные этого объекта как то так.это интересно понять
0
|
||
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
||||
| 16.02.2012, 20:13 | ||||
|
0
|
||||
| 16.02.2012, 20:13 | |
|
Помогаю со студенческими работами здесь
20
Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Проверка email адреса на существование Проверка на существование proxy адреса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|