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

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

16.02.2012, 15:40. Просмотров 10551. Ответов 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
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,165
18.02.2012, 19:06 61
чей то файл не прикрепился посылаю еше раз
0
Вложения
Тип файла: rar tstOptimise.rar (3.2 Кб, 12 просмотров)
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
24.02.2012, 12:07 62
Вот пример на логическое время жизни:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int x = 1;
 
int main (void)
{
  /* В данной точке __локальная__ переменная "x" логически ещё не существует
   * (хотя компилятор память под неё уже выделил). Поэтому в данной точке
   * в качестве "x" подставится __глобальная__ переменная */
  int a = x;
 
  int x = 2;
 
  /* А в этой точке __локальная__ переменная "x" уже существует, и подставится
   * именно она */
  int b = x;
 
  printf ("a=%d, b=%d\n", a, b);
 
  return 0;
}
Код
$ gcc t.c
$ ./a.out
a=1, b=2
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:11  [ТС] 63
интерeсно

Добавлено через 1 минуту
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
и глобальные объекты не имеют "логической жизни"?

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
int z;
};
A a; //типа он логически не жилец?
int main ()
{
a.z = 5;
 
return 0;}

логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе. в данном случае по имени переменной.
Я правильно сформулировал?
Напиши плиз свою версию.
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
24.02.2012, 16:17 64
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
Не "по моему", а "по стандарту". И не с объявления в стеке, а с написания в исходнике.

Цитата Сообщение от AzaKendler Посмотреть сообщение
и глобальные объекты не имеют "логической жизни"?
У них время жизни "вся программа". Т.е. от начала исполнения main и до завершения работы программы

Цитата Сообщение от AzaKendler Посмотреть сообщение
логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе
Логическая жизнь - это то, что гарантирует стандарт. Что начиная с этой точки к переменной можно обращаться. Будь то с точки зрения языка (т.е. по имени), будь то с точки зрения исполняемого кода. Т.е. если до объявления локала ты воткнёшь ассемблерную вставку, которая будетработать с памятью, которую компилятор отвёл под локал, и если этот код не будет работать должным образом - то сам дурак, потому что компилятор (а точнее, стандарт) будет тебе гарантировать корректную работу с переменной только начиная с точки её объявления в исходнике.
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:23  [ТС] 65
Секция .data

Как по умолчанию программный код попадает в секцию .text, так и инициализированные данные попадают в секцию .data. Инициализированные данные состоят из тех глобальных и статических переменных, которые были проинициализированы во время компиляции. Они также включают строковые литералы (например, строку "Hello World" в программе C/C++). Компоновщик объединяет все секции .data из разных объектных и LIB-файлов в одну секцию .data в ЕХЕ-файле. Локальные переменные расположены в стеке цепочки и не занимают места в секциях .data и .bss.
абстрактная цитата

те переменные которые ты привел в примере они располагаются в разных точках просто.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Что начиная с этой точки к переменной можно обращаться.
в твоем примере к глобальной х можно обращаться. в моем к а тоже.
что не так с логической жизнью у них? поясни

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
/* В данной точке локальная переменная "x" логически ещё не существует
* ** (хотя компилятор память под неё уже выделил). *
*
}
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
24.02.2012, 16:44 66
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
Попробуйте.
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:52  [ТС] 67
невнимательно читал. речь шла о локальной переменной.
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
24.02.2012, 16:54 68
AzaKendler, пример Evg был о другом. Глобальная переменная там была только для того, чтобы показать, что логически в коде "до" объявления локальной переменной её не существует, а существует глобальная, к которой и будет обращение. Вот минимальный код, который показывает то же, но тут не получится запутаться в локальных/глобальных именах.
C++
1
2
3
4
5
int main()
{
    x = 10;
    int x;
}
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:57  [ТС] 69
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
все верно. спутал с глобальной. невнимательно читал

Добавлено через 28 секунд
silent_1991, да я уже понял. слово локальная в его фразе как то "пропустил"

смешно получилось
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
24.02.2012, 17:00 70
Да, глобальная переменная была только для того, чтобы показать, что в первой точке локальной переменной x ещё не существует (в подверждение этого обращаясь к x, мы попадём именно к глобальной переменной). Это было сделано для того, чтобы получить пример, который компилируется и исполняется. Коротенький пример от silent_1991 показывает ровно то же самое, но в качестве подтверждения выступает ошибка компиляции
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2012, 17:00

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

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

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

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

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


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

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

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