![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Вот внезапно в голову забралась мысль
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Не будет -------------------- Да. Именно так. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Дрон
Чем докажешь ? |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
С++ это не Java и не C#. Он ссылки на объекты не контролирует.
-------------------- Да. Именно так. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Дрон
Я говорю про контроль НЕ ссылок, а переменных... они в таких точно не уничтожаются. Сам попробуй. |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Что значит не уничтожается? Память освобождается и некоторое время будет ещё хранить значения, пока её какая-нибудь функция не перезапишет. -------------------- Да. Именно так. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
если ты возвращаеш char* то где-то ( пусть в функции ) был new. вот эта _память_ и висит, но висит она не на стеке. а сам указатель возвращается по значению ( т.е. т он не висит... )
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Дрон
стек простейшего метода chat* tempo(void); - будет существовать, как мне кажется до тех пор, пока эта ссылка не будет обнулена: char *tempo_ptr = tempo(void); Согласен ? |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
En_t_End, проверь
Следуя твоей логики должно быть выведено 0 1 2. Следуя логики Си это совсем не так. Добавлено @ 17:34 En_t_End У функций НЕТ стека. Стек один. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
_hunter
С new - это другой случай... там Си работает с динамической памятью - поэтому по сути указатель указыват на некоторую область памяти, причем стек функции не будет управлять ею. ИМХО Добавлено @ 17:40 Mayk Не понял... как это ? А как же вся та инфа, из которой я понял, что функция или процедура - это мини программа, соответсвенно... стек должен быть, как тогда реализовано управление переменными ? То что есть глобальный стек я не оспариваю. Добавлено @ 17:41 Дрон Бьярн Страуструп по моему писал, что ни одна переменная не будет уничтожена, пока на неё будет ссылаться указатель. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Посмотрим в ассемблер. Когда возвращается указатель перед вызовом функции стек смещается:
stack:.......................................перед вызовом:...........................................после call (вызов функции) o|o|o|o|o|*........----->......... o|o|o|o|o|_memory_for pointer_| ---->...o|o|o|o|o|_memory_for_pointer_|_back_address_ далее в то место, где _memory_for_pointer_, записывается указатель. Мы выходим из функции: команда ret Поп-ает адресс возврата. и смещает туда каретку...теперь мы делаем Pop и забираем результат. o|o|o|o|o|_memory_for_pointer_.......................................------>.................................o|o|o|o|o| Стек снова в исходном состоянии!! Если хотите, можно подробнее. Но разницы в том, что возвращать, нет. Тока память разная в стеке отводится перед вызовом call Это сообщение отредактировал(а) comcon1 - 22.6.2005, 17:48 |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
тогда я не понял что ты возвращаеш в своем указателе ( если ты под него память не выделяеш )...
но даже в таком случае вернется 4байта по значению и стек благополучно хрохнется -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
_hunter
Вот пример... ну не скажешь же ты, что потом юзая в классе то что получу в результате этой функции я буду юзать призрака ?
Это сообщение отредактировал(а) En_t_end - 22.6.2005, 17:57 |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Програма выполняется по мере считывания ее из памяти. Есть в регистрах процессора указатель на место, где мы считываем (кажется IP) Instruction Pointer.
Здесь дело в том, что в функцию мы входим (команда CALL). И в стек заносится аддресс IT того места, откуда мы прыгаем в функцию. Внутри функции мы производим некоторые операции и возвращаемся (команда RET). И ВЕРХУШЕЧНЫМ ЭЛЕМЕНТОМ ДОЛЖЕН БЫТЬ АДДРЕСС возврата в тело прораммы. Иначе будет RunTimeError. Из-за этого в стеке сначала отводят память (смещая указатель на вершину, стек в процессоре в обр. направлении) SUB SP, 04 SUB - вычесть. SP - STACK POINTER. А потом уже входим в функцию. CALL 0AFFF (аддресс входа туда будет смещен IP) Ну а когда мы вернулись - мы берем из стека значение и приводим его в исходное состояние. Никаких перегрузок. Это сообщение отредактировал(а) comcon1 - 22.6.2005, 17:55 |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
не скажу
потому что ты явно выделил память ( и никто короме тебя ее удаялть не будет ) а вот если где-то перед юзанеем сделаеш delete[] ( причем не обязательно tempo ) то именно призрака ты и получиш... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |