Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/70: Рейтинг темы: голосов - 70, средняя оценка - 4.71
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15

[C++] Взятие адреса конструктора. Физическое время существование объекта.

16.02.2012, 15:40. Показов 16257. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. конструктор.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
 
int a;
public:
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это вызов конструктора - явный. он используется контейнерами stl.
//вывод - конструктор можно вызвать явно и с параметрами и без.
// возвращается некий указатель на начало объекта
};
Вопрос: если объект начинается с конструктора, то полученный нами указатель - будет указывать на конструктор? и только высокоуровневые ограничения не дают нам видеть его среди членов объекта и работать с ней. Если это так, то спутившись на уровень ниже, туда где нет ограничений, по идее получив данный адрес - мы можем сделать call по этому адресу. другое дело какой эффект получится, непонятно.
поэтому обращаюсь к тебе Evg как к очень опытному специалисту знающему "нутро".
вот мы сделали бинарник. в нем программа, в ней создаются объекты классов.
мне сложно судить где буду лежать эти объекты, предположу что в .text
если мое предположение верно, то после отображения в память, можно будет обратится к конструктору зная его адрес, поскольку никакие высокоуровневые вещи не будут мешать.

вопрос 2

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
class A
{
public:
    int a;
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это временный объект и сразу после создания будет вызван деструктор
 
int mass [1000];
 
for(int i=0;i<1000;i++)//это вызовы для мебели и зачистки останков временных объектов
    mass[i] = i;
 
 
pa->~A(); //не вызывается. объекта нет НО
int z = pa->a; //дело его живет. z ==555
 
 
return 0;
};
каково время жизни поля класса после уничтожения объекта класса?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2012, 15:40
Ответы с готовыми решениями:

Взятие значение из адреса
Имеется код добавления объекта &quot;точка&quot; в массив точек: void arr_point::add_point(point &amp;p) { point *buf = new point;//Создаю...

Взятие адреса в аргументе
Есть такой код: void STOCK::acquiare(const std::string &amp;co,long n, double pr) { company=co; if (n&lt;0) { ...

Взятие адреса у константной переменной при объявлении
Можно пример?

69
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 20:13  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от retmas Посмотреть сообщение
адрес начала куска памяти, хранящей состояние(данные) объекта
вот первый ответ
0
Заблокирован
16.02.2012, 20:14
Цитата Сообщение от AzaKendler Посмотреть сообщение
сформулируй однозначное определение плиз.
Вот это вот недостаточно однозначное определение?
Цитата Сообщение от Bers Посмотреть сообщение
"Объект" на с++ это кусок памяти.
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 20:15  [ТС]
Цитата Сообщение от AzaKendler Посмотреть сообщение
поля объекта лежат в секции данных. методы в секции кода. в секции данных хранятся смещения до методов в секции кода.
методы естественно на таком уроне есть функции.
получая указатель на объект класса с++ мы получаем адрес некой сигнатуры этого класса(нулевой байт) в секции данных, далее подряд идут данные этого объекта
как то так.это интересно понять
ну распиши вот так. поделись знаниями пожалуйста
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.02.2012, 20:23
Цитата Сообщение от AzaKendler Посмотреть сообщение
получая указатель на объект класса с++ мы получаем адрес некой сигнатуры (нулевой байт) этого класса в секции данных
речь идет о статических объектах? или о любых?
память, выделенная из кучи под объект, или создание объекта на стеке не в счет?
AzaKendler, что-то я не очень понимаю, что вы хотите выяснить?
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 20:29  [ТС]
retmas, речь идет об объекте класса на стеке и взятия его адреса.
о том что собой будет представлять этот объект в бинарном файле и в итоге в памяти после загрузки бинарника. о том что если мы получаем указатель на нулевой байт объекта, то это видимо указатель на секцию с данными в которой должна еще содержаться информация о смещениях на "методы" в секции кода. все это в итоге приведет нас к тому что мы двигаясь по секции с данными можем найти смещение на конструктор. подтвердите или опровергните пожалуйтса

Добавлено через 1 минуту
Цитата Сообщение от retmas Посмотреть сообщение
что вы хотите выяснить?
точное представление высокоуровневых объектов с++ - таких как экземпляры объектов класса, на уровне бинарного файла.
0
Заблокирован
16.02.2012, 20:30
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну распиши вот так. поделись знаниями пожалуйста
Пожалуйста:

В секции данных лежат указивки загрузчику файла, чем заполнить статическую область памяти программы перед её запуском.

Есть ещё секция кода - там боевой код программы, и ещё всякие разные секции, с которыми ты можешь ознакомится мало мало погуглив, например "формат PE"

Получая адрес объекта, ты получаешь адрес ячейки памяти, с которой начинаются данные этого объекта.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.02.2012, 20:32
Цитата Сообщение от AzaKendler Посмотреть сообщение
речь идет об объекте класса на стеке и взятия его адреса.
Цитата Сообщение от AzaKendler Посмотреть сообщение
получаем указатель на нулевой байт объекта, то это видимо указатель на секцию с данными
противоречий не видите?
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 20:35  [ТС]
Bers, ладно. я читал про пе, потому и появились вопросы. думал ты как чел с большой практикой расскажешь. но тебе скорее всего это просто неинтересно.
тогда и прикрыть можно тему эту.

Добавлено через 23 секунды
Цитата Сообщение от retmas Посмотреть сообщение
противоречий не видите?
в чем они аа. щас поясню

Добавлено через 1 минуту
Цитата Сообщение от retmas Посмотреть сообщение
Сообщение от AzaKendler
речь идет об объекте класса на стеке и взятия его адреса.
Сообщение от AzaKendler
и представлении его в бинарном файле. в PE


______________
спасибо всем за потраченное время и ответы
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.02.2012, 20:52
Цитата Сообщение от AzaKendler Посмотреть сообщение
должна еще содержаться информация о смещениях на "методы" в секции кода
Да не должна в объектах информация о методах содержаться. Вот вызываем мы функцию foo с одним аргументом типа int. Что, по-вашему, там, где хранится значение этой переменной типа int, ещё и адрес foo должен лежать? Нет, конечно. Так вот объект класса - это, по сути такая же переменная некоторого типа (вернее, голые байты в некотором количестве). Вызов метода компилятором разворачивается в такой же вызов функции, как вызов foo. Никаких смещений. Объект ничего не знает о своих методах (просто никаких методов и объектов уже нет, компилятор помещает в стек некоторый набор данных (ранее объект) и передаёт управление некоторому адресу в памяти (ранее методу)).
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 21:10  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вот вызываем мы функцию foo с одним аргументом типа int.
ты перевернул. в функцию аргумент из стека придет.

а вот вызываем мы метод класса - это слегка другой процесс не находишь?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.02.2012, 21:14
AzaKendler, не-а, не нахожу. Вызов a.foo() разворачивается в foo(&a). this и есть тот указатель (являющийся неявным параметром любого нестатического метода класса), который содержит адрес вызывающего объекта.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.02.2012, 21:14
AzaKendler, уж не раз отсылал тебя к своей статье, почему-то не хочешь читать, хотя все ответы на твои вопросы там есть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
  public:
    int a;
 
    A() : a(555) {}
    ~A() {}
};
 
int main()
{
  A* pa = &A();
}
эквивалентно

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
/* Вот так выглядит экземпляр класса в памяти */
struct A
{
  int a;
};
 
/* Конструктор */
void A_constr (struct A *this)
{
  this->a = 555;
}
 
/* Деструктор */
void A_destr (struct A *this)
{
}
 
int main (void)
{
  /* Эти две строки есть эквивалент кода "A()" */
  tmp_A;
  A_constr (&tmp_A);
 
  /* А эта строка в совокупности с двумя предыдущими есть
   * эквивалент кода "A *pa = &A();" */
  A *pa = &tmp_A;
}
Указатель pa смотрит на фрагмент стека, куда компилятор распределил временный объект. От этого куска стека ты никак не можешь попасть до того реального места, где у тебя лежит процедура, соответствующая конструктору.

Если теперь откомпилировать программу на Си++ и посмотреть на код:

Code
1
2
3
$ g++ t.cc -c
t.cc: In function 'int main()':
t.cc:12: warning: taking address of temporary
Code
1
2
3
4
5
6
7
8
9
$ readelf --symbols t.o
 
Symbol table '.symtab' contains 16 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
    12: 00000000    14 FUNC    WEAK   DEFAULT    7 _ZN1AC1Ev
...
    14: 00000000     5 FUNC    WEAK   DEFAULT    8 _ZN1AD1Ev
    15: 00000000    48 FUNC    GLOBAL DEFAULT    3 main
Функция _ZN1AC1Ev соответствует конструктору, функция _ZN1AD1Ev - деструктору. Чтобы такие кривые (манглированные) имена переводить в божеский вид, можно воспользоватся утилитой c++filt:

Code
1
2
3
4
$ c++filt _ZN1AC1Ev
A::A()
$ c++filt _ZN1AD1Ev
A::~A()
2
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 21:52  [ТС]
Указатель pa смотрит на фрагмент стека, куда компилятор распределил временный объект. От этого куска стека ты никак не можешь попасть до того реального места, где у тебя лежит процедура, соответствующая конструктору.


хорошо. видимо пример не очень. давай возьмем объект с временем жизни подольше

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct A
{
 void test(){int a =56;int b =4; int c =a+b;}
}
 
int main()
{
A a;
A* pa = &a;//указывает на секцию с данными на начало "a",верно?
pa->test();  //вызов возможен.
pa->~A; //тоже
 
}
где же лежит конструктор? в "особом" месте?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.02.2012, 22:02
Ау!! Ты вообще читаешь, что тебе пишут? Конструктор с точки зрения кода это САМАЯ ОБЫЧНАЯ ФУНКЦИЯ.

Цитата Сообщение от AzaKendler Посмотреть сообщение
а из этого места я могу попасть туда где лежат другие процедуры и деструктор например?
Создай локал "int x;" в функции main, возьми на "x" адрес. Как из "этого места" ты можешь "попасть туда, где лежат другие функции (например, func)". Очевидно, что никак

Цитата Сообщение от AzaKendler Посмотреть сообщение
что это означает? конструктор что лежит в "особом" месте?
Ещё раз. Конструктор - это ОБЫЧНАЯ ФУНКЦИЯ и лежит она там, где лежат все остальные функции

Цитата Сообщение от AzaKendler Посмотреть сообщение
где же лежит конструктор? в "особом" месте?
См. выше
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 22:05  [ТС]
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
и теоретически мы можем вызвать конструктор, поскольку он является обычной функцией найдя его адрес в загруженном в память файле. верно? я имею ввиду следующее - загрузили файл, нашли адрес его модуля, допустим мы знаем смещение до такой функции как конструктор и найдя ее адрес в памяти обращаемся к ней минуя высокоуровневые конструкции
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.02.2012, 22:11
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
Именно так. Точно так же ты можешь "вызвать" переменную. Правда засада может быть в том, что переменные складываются в страницы памяти, в которых операционная системе не разрешает исполнять код, но это всё рулится (под линуксом через mprotect)

C
1
2
3
4
5
6
7
8
/* Тут как бы рисуем код */
char c[] = { 0x11, 0x22, 0x33, .... }
 
int main (void)
{
  mprotect ( /* лень разбираться, что конкретно тут подавть надо */); */
  ((void(*)(void)) &c)();
}
1
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 22:14  [ТС]
Evg, спасибо. и последний вопрос.
0
Заблокирован
16.02.2012, 22:17
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.02.2012, 22:21
Цитата Сообщение от Bers Посмотреть сообщение
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
Я плохо разбираюсь в Си++, но, насколько знаю, адрес конструктора средствами языка взять нельзя
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
16.02.2012, 22:25  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
адрес конструктора средствами языка взять нельзя
из текущего модуля в котором и пишется класс. а из загруженного файла функциями api все что угодно. надо только понять где конструктор в образе файла. и тогда получится вызов констуктора как простой функции из языка с++, средствами с++, но...не в том файле в котором писался искомый класс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2012, 22:25

Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Доброго времени суток. Очень часто наблюдаю во всевозможных примерах такого вида код: void* bits = (void*)&amp;(pixels); Таких...

Проверка URL адреса на существование
Доброго времени суток! Есть определенный цикл по перебору страниц сайта, цикл определяет некоторые недоступные страницы вследствие их...

Проверка email адреса на существование
Доброго времени суток. Есть надобность в небольшой программе. Суть в том что после ввода email адреса ей нужно проверить её существование. ...

Проверка на существование proxy адреса
Добрый день У меня такой вопрос Каким кодом я могу осуществить проверку на существование proxy адреса на работоспособность. Допустим...

Файлы: ввод адреса объекта и вывод данных объекта
Всем привет. Хочу сделать программу, в консоль которой, вводится адрес папки/файла, после чего, консоль выводит данные этого объекта. ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru