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

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

16.02.2012, 15:40. Показов 15432. Ответов 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru