![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Здравсвуйте! Хотелось бы просветиться по следующему вопросу. В C++ можно объявить объект класса вот так: MyClass a; и через указатель: MyClass* b. Насколько я понимаю, внешнее отличие в этих двух способах в том, что переменной а мы не можем передать другой объект типа MyClass, а переменной b - можем. Однако хочется понять, как дело обстоит на более низком уровне? Переменная а будем размещена в стэке или в куче?
|
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| zkv |
|
||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Idsa, MyClass* b - указатель на объект, сам объект в этом случае нигде сам не появится, если только мы память под него не выделим: b = new MyClass(/*params if need*/);
неправильно понимаете. Если рассматривать такую ситуацию:
то переменная a представляет из себя объект класса (причем он лежит в стеке), а переменная b - это адрес объекта в куче. или такой случай:
a - объект класса, а b - указатель на него, те все действия над объектом лежащим по адресу, хранящемуся в b будут отражены на объекте a, так как это он и есть А вы из дотнета пожаловали? В таком случае напомню, что память выделенную под объекты (MyClass* b = new MyClass;) надо еще и освобождать delete b; (delete []b; - для массивов). Стековых переменных это не касается Это сообщение отредактировал(а) zkv - 16.5.2007, 20:00 |
||||||
|
|||||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Понт Да, именно такую ситуацию я имел в виду. Ага. Просто после C# дико смотрится то, что классы могут храниться в стеке zkv, +1. Ну и еще в тему топика. Чем обусловлено то, что на этапе компиляции мы можем задать массив, хранящийся в стеке: int a[3], а в рантайме можем заюзать для массива только кучу: int* a[] = new int[n]? Это сообщение отредактировал(а) Idsa - 16.5.2007, 20:22 |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Idsa, а потому что, насколько я понимаю, чтобы посчитать смещение в стеке, нужно знать размер массива...
поправьте, если ошибаюсь... -------------------- СУВ, Partizan. |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Partizan, конечно так
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Idsa, в том то и прикол что момент выделения памяти происходит в рантайме и на этапе сборки смещения посчитать ну никак компилятор несможет )
-------------------- СУВ, Partizan. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
"не в куче" не означает в стеке. В стеке размещаются автоматические переменные. Глобальная
Что значит в рантайме? new [] используется когда размер при компилляции неизвестен. Конструкция int* a[] = new int[3] в любом случае может быть заменена на int a[3] |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Я очепятался и уже исправил. Вопрос звучал именно так: Добавлено через 2 минуты и 58 секунд Переменная типа MyClass myVar будет удалена из стека сразу после выхода из ее области видимости? |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Понятно. Пасиб. +1. Ну а что все-таки насчет вот этого вопроса:
Но при этом в первом случае память выделится в куча, а во втором - в стеке? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
В смысле, я так понял, имелась в виду конструкция int *a = new int[3]; Что-то я не понял. Это по какому праву компилятор сделает массив в стеке? Это же может привести к AV причем совершенно на ровном месте. А вообще-то конструкция int a[3] не обязательно создается в стеке. Например, определенная вне функций и методов она создастся в куче. А еще есть слово static... Это сообщение отредактировал(а) Anikmar - 16.5.2007, 21:11 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
верно всегда а это зависит от обстоятельств(где создано) |
|||
|
||||
| Idsa |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: нет Всего: 62 |
Да
Что за AV? По контексту я подумал про Stack Overflow... но не подходит
Если массив статический или глобальный, то он будет создан в сегменте данных. Но если массив ни статический, ни глобальный, то он точно будет создан в стеке. Ведь так? P. S. Прошу обратить внимание на мою подпись! Это сообщение отредактировал(а) Idsa - 16.5.2007, 22:22 |
||||||
|
|||||||
| Hurricane |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
Ну, в принципе, и в первом случае можно память в стеке выделить - если перегрузить оператор new. Добавлено через 1 минуту и 37 секунд
Это он так Memory [A]ccess [V]iolation обозвал. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |