Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.74
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

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

16.02.2012, 15:40. Просмотров 8781. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2012, 15:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C++] Взятие адреса конструктора. Физическое время существование объекта. (C++):

Почему лучше инициализировать объекты класса во время инициализации конструктора? - C++
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

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

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

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

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

[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу - C++
По заданию требуется: 1) Создать функцию void Insert(Person&amp; person, int index), помещающую переменную типа Person по указанному...

69
Bers
Заблокирован
16.02.2012, 19:55 #16
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, тогда поясни еще пожалуйста, куда в бинарном файле попадают методы объекта класса. они лежат отдельно от полей?
В самом бинарном файле присутствует только боевой код скомпилированных функций.
Никаких экземпляров классов, с его полями там нет.

Добавлено через 1 минуту
Цитата Сообщение от AzaKendler Посмотреть сообщение
A* a = &A();
Будит запущена функция A();
Результатом работы функции будит объект.

Далее: &объект
Результат работы - адрес объекта.

Что не понятного?
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:04  [ТС] #17
Цитата Сообщение от Bers Посмотреть сообщение
В самом бинарном файле присутствует только боевой код скомпилированных функций.
Никаких экземпляров классов, с его полями там нет.
конструктор - функция? поля - данные?

вопрос. получая указатель на созданный объект класса - получаем адрес чего?

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
адрес объекта.
объекта нет. он существует на уровне с++, так на что указывает указатель? на данные? или на боевую функцию в памяти?
A* a = &A();

если на данные то в данных в бинарнике должен быть адрес того где искать конструктор. верно?
0
Bers
Заблокирован
16.02.2012, 20:06 #18
Цитата Сообщение от AzaKendler Посмотреть сообщение
конструктор - функция? поля - данные?

вопрос. получая указатель на созданный объект класса - получаем адрес на что?
"Объект" на с++ это кусок памяти. (не путать с "экземплярами классов ООП" )

Указатель - это переменная, которая хранит адрес памяти.

Получая указатель, который хранит адрес созданного объекта, ты получаешь адрес этого объекта.
Адрес ячейки памяти, с которой начинается нулевой байт этого объекта.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:10  [ТС] #19
Цитата Сообщение от Bers Посмотреть сообщение
Адрес ячейки памяти, с которой начинается нулевой байт этого объекта
так что есть объект в терминах - "данные - боевые функции". что есть его нулевой байт? он в секции данных или кода?

сформулируй однозначное определение плиз. это важно. например объект класса с++ на уровне бинарного файла это:

поля объекта лежат в секции данных. методы в секции кода. в секции данных хранятся смещения до методов в секции кода.
методы естественно на таком уроне есть функции.

получая указатель на объект класса с++ мы получаем адрес некой сигнатуры (нулевой байт) этого класса в секции данных, далее подряд идут данные этого объекта

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

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

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

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

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

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

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


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

а вот вызываем мы метод класса - это слегка другой процесс не находишь?
0
16.02.2012, 21:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2012, 21:10
Привет! Вот еще темы с ответами:

Существование объекта - C++
Здравствуйте, есть довольно сложное и интересное задание Есть класс someClass нужно сделать так чтобы: 1) Его объекты можно было...

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

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

Проверить существование объекта - C++ Qt
Есть QList&lt;QTcpSocket*&gt; _psocks. Все сокеты, которые попадают в этот список проходят через соединение: connect(psock,...


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

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

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