![]() |
|
Модераторы: bsa |
![]()
|
|
| RenderMan |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 20.5.2008 Репутация: нет Всего: нет |
Решил поиздеваться над компилятором:
не ту-то было, ошибки не произошло, что вообще логично, т.к. указатель указывает на какую-то область памяти, и мы вправе делать с этой памятью все, что захотим(или нет?). Теперь немного модифицируем код:
теперь программа ругается(SIGSEGV). Еще немного изменим код:
на консоль выводятся одинаковые числа, т.е. выделяется одна и та же память. Но почему проге все нравится, пока я делаю,что хочу с НЕПРИНАДЛЕЖАЩЕЙ ей памятью , а потом, когда мы выделяем ей совершенно легально ту самую память, она начинает ругаться? Каким образом куча узнает, что я что-то делал со свободной памятью, или она ведет какой-то ее мониторинг? Хочу обратить внимание,что крэш идет именно на выделении памяти под b. Или может быть так,что,например, куча считает,что это нрмальная ячейка памяти, но когда она(куча) просит ее выделить у системы, та ей говорит, что, мол, только что к ней обращялись, и поэтому я тебе эту память не отдам. Разъясните, пожалуйста, по-моему, это важный вопрос. |
||||||
|
|||||||
| Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
Почему?
Мы освобождаем участок памяти, адрес которой хранится в указателе, но указатель остается, мы его-то не удаляем никуда, можем поменять адрес. И чего тут такого великого??? -------------------- |
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
это вам просто повезло
любой указатель указывает на какую-то область памяти с вышеозначеным явлением это никак не связано или нет это не программа ругается, а процессор дальнейший бред не понят, сорри |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
процессор SIGSEGV'ами не ругается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Что такое SIGSEGV я не знаю, но думаю дело такое:
В первом коде память освобождена и пока никем не занята, ук-ль a указывает на неё, т.к. его значение не изменилось, через него работаем с этой памятью Во втором коде память освобождена, потом выделена заново, и получилось, что a указывает уже на чужую память, а не на свободную или свою. Видимо поэтому и произошла ошибка. В третьем случае, ничего непонятного. Просто получилось так, что b выделилось на месте a. Просто совпадение. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нет.. во всех случаях просто совпадение. Система не всегда может определить запись программы не в "свою" память - один и тот же пример в разных контекстах может давать разный результат. |
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
RenderMan, в принципе можно разбить молотком монитор и радоваться тому, что можешь делать все что угодно не только с памятью, но и с монитором
А можно пойти и дальше, выйти во двор и разбить лобовое стекло первому попавшемуся автомобилю и радоваться тому, что ты можешь делать все что угодно и с ним Главное думать о последствиях Все, что ты делаешь обязательно приведет к проблемам, даже если это все прокатило на твоем компиляторе, если твоя программа будет немного длиннее и функциональнее Вообщем, повелитель памяти... Попробуй сделать прогу на основе своих извращений и все станет ясно... -------------------- |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Все очень просто: когда ты сделал int* a= new int(1); crt выделила кусок памяти и вернула его адрес, который затем попал в a. Реальный размер выделенного участка, а равно как и его реальное начало в памяти, не обязаны совпадать с тем, что ты запрашивал. Скорее всего, будет выдеден блок байт так в 8-16, и перед a еще будет байт 8 с размером выделенного участка.
Затем ты делаешь delete a;, память, ранее занимаемая этим блоком, возвращается в пул свободной памяти. При этом этот блок провязывается в списки свободной памяти, для указателей этих списков используется тело блока (это можно сделать, т.к. приложение аернуло эту память, и crt имеет право распоряжаться ей по своему усмотрению) Затем, ты делаешь *a =5;, перезаписывая таким образом один из указателей списка свободной памяти своей 5кой. Список свободных блоков разрушен |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
процессор ругается протекшен-фолтами, которые транслируются ОС в SIGSEGV ты удовлетворен? Это сообщение отредактировал(а) J0ker - 9.12.2008, 19:05 |
|||
|
||||
| RenderMan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 20.5.2008 Репутация: нет Всего: нет |
Извращался я не потому что писал прогу, а хотел понять механизм выделения памяти с помощью крэшей). Весь вопрос собственно заключался в следующем: каким макаром мех-изм выделения памяти узнает,что я что-то делал со свободной памятью. по-моему, xvr все объяснил, за что ему отднльная благодарность). Всем спасибо)
|
|||
|
||||
| taiven |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 302 Регистрация: 30.6.2008 Репутация: 2 Всего: 9 |
вот это мне кажется поинтересней будет
Это сообщение отредактировал(а) taiven - 11.12.2008, 02:01 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |