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

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

16.02.2012, 15:40. Просмотров 10543. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2012, 15:40
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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


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

а вот вызываем мы метод класса - это слегка другой процесс не находишь?
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
16.02.2012, 21:14 31
AzaKendler, не-а, не нахожу. Вызов a.foo() разворачивается в foo(&a). this и есть тот указатель (являющийся неявным параметром любого нестатического метода класса), который содержит адрес вызывающего объекта.
1
Evg
Эксперт CАвтор FAQ
21115 / 8131 / 628
Регистрация: 30.03.2009
Сообщений: 22,447
Записей в блоге: 30
16.02.2012, 21:14 32
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 смотрит на фрагмент стека, куда компилятор распределил временный объект. От этого куска стека ты никак не можешь попасть до того реального места, где у тебя лежит процедура, соответствующая конструктору.

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

Код
$ g++ t.cc -c
t.cc: In function 'int main()':
t.cc:12: warning: taking address of temporary
Код
$ 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:

Код
$ c++filt _ZN1AC1Ev
A::A()
$ c++filt _ZN1AD1Ev
A::~A()
2
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 21:52  [ТС] 33
Указатель 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
21115 / 8131 / 628
Регистрация: 30.03.2009
Сообщений: 22,447
Записей в блоге: 30
16.02.2012, 22:02 34
Ау!! Ты вообще читаешь, что тебе пишут? Конструктор с точки зрения кода это САМАЯ ОБЫЧНАЯ ФУНКЦИЯ.

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

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

Цитата Сообщение от AzaKendler Посмотреть сообщение
где же лежит конструктор? в "особом" месте?
См. выше
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:05  [ТС] 35
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
и теоретически мы можем вызвать конструктор, поскольку он является обычной функцией найдя его адрес в загруженном в память файле. верно? я имею ввиду следующее - загрузили файл, нашли адрес его модуля, допустим мы знаем смещение до такой функции как конструктор и найдя ее адрес в памяти обращаемся к ней минуя высокоуровневые конструкции
0
Evg
Эксперт CАвтор FAQ
21115 / 8131 / 628
Регистрация: 30.03.2009
Сообщений: 22,447
Записей в блоге: 30
16.02.2012, 22:11 36
Цитата Сообщение от 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
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:14  [ТС] 37
Evg, спасибо. и последний вопрос.
0
Заблокирован
16.02.2012, 22:17 38
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
0
Evg
Эксперт CАвтор FAQ
21115 / 8131 / 628
Регистрация: 30.03.2009
Сообщений: 22,447
Записей в блоге: 30
16.02.2012, 22:21 39
Цитата Сообщение от Bers Посмотреть сообщение
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
Я плохо разбираюсь в Си++, но, насколько знаю, адрес конструктора средствами языка взять нельзя
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:25  [ТС] 40
Цитата Сообщение от Evg Посмотреть сообщение
адрес конструктора средствами языка взять нельзя
из текущего модуля в котором и пишется класс. а из загруженного файла функциями api все что угодно. надо только понять где конструктор в образе файла. и тогда получится вызов констуктора как простой функции из языка с++, средствами с++, но...не в том файле в котором писался искомый класс
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2012, 22:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.