Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как работает free 
:(
    Опции темы
unel
Дата 20.7.2005, 12:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











вот допустим выделяю для чего-нить память
char *p;
p=malloc(10);


21 F5 7A [AE AD 1A 2E 34 15 EA B5 6E CC] BA 70 A4 13 FE
------------^p


p указывает на начало выделенной области ... угу, 10 байт и всё такое ...
если щас пустить free(p) то он освободит эти 10 байт ...

как он узнаёт, сколько байт надо освободить?

и допустим, если сместить указатель, ну вот так

21 F5 7A [AE AD 1A 2E 34 15 EA B5 6E CC] BA 70 A4 13 FE
-----------------------^p


а потом сделать free(p), то он:

освободит байты начиная с него, и до байта CC включительно
или
освободит 10 байт, начиная с него?


  Вверх
chaos
Дата 20.7.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата

и допустим, если сместить указатель, ну вот так

21 F5 7A [AE AD 1A 2E 34 15 EA B5 6E CC] BA 70 A4 13 FE
-----------------------^p

а потом сделать free(p), то он:

освободит байты начиная с него, и до байта CC включительно
или
освободит 10 байт, начиная с него?

по идеи программа должна вывалиться, после такого


Это сообщение отредактировал(а) chaos - 20.7.2005, 12:48
PM WWW   Вверх
Mayk
Дата 20.7.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(unel @ 20.7.2005, 13:32)
освободит байты начиная с него, и до байта CC включительно
или
освободит 10 байт, начиная с него?

Скорее всего он сделает что-то страшное, например вылетит с Segmentation Fault. Причём не сразу. Он может вылететь при следующих обращениях к free. И тогда "Здравствуй, отладчик" smile

Всё зависит от компилятора(который может сам организовывать менеджер памяти) и оси. malloc может вставлять размер выделенного блока в самое начало блока. То есть, чтобы узнать размер реально выделенного блока можно сделать так
Код

size_t* arr = malloc(17)
printf("%d\n",arr[-1]);//или -2 или -3... в общем куда-то туда




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 20.7.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



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


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 20.7.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Дрон
У меня по [-1] точно размер стоит(realloc'ом проверил только что). И с отладчиком я тоже уже ни раз "мучился", когда фигню освобождал. Но это всё очень сильно зависит от реализации как оси, так и компилятора.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 20.7.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(Mayk @ 20.7.2005, 14:15)
меня по [-1] точно размер стоит(realloc'ом проверил только что).

Круто!

Цитата(Mayk @ 20.7.2005, 14:15)
Но это всё очень сильно зависит от реализации как оси, так и компилятора.

И какая же ОСь и компилятор? smile


Добавлено @ 13:29
Кстати, а какова размерность "размера"? smile
sizeof(int) наверно?



--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 20.7.2005, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата
Цитата (Mayk @ 20.7.2005, 14:15)
меня по [-1] точно размер стоит(realloc'ом проверил только что).
Круто!

Лучше бы сказал что у тебя там хранится smile Мне лениво машину перегружать smile
Цитата
И какая же ОСь и компилятор?

Ну у меня это линуха и gcc smile
Цитата
Кстати, а какова размерность "размера"?

size_t по идее. Хотя кто его знает, что производителю в голову придёт.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 20.7.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Mayk
Цитата(Mayk @ 20.7.2005, 14:33)
Лучше бы сказал что у тебя там хранится smile Мне лениво машину перегружать smile

Я чейчас на работе и занят соооовсем другими вещами...

Но быстренько проверил в Visual Studio 2003. Язык С++. Режим Debug.
Хранится, судя по всему, непонятно что smile

Но конкретней выянсять некогда.


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 20.7.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Посмотрел Поросю с bcc32(не то из Builder'а, не то из free command tools, не помню уже). Там тоже, судя по всему, размер. Но realloc'ом тестить уже не стал. Просто менял размел i в выражении malloc(i). Всегда было allocated[-1] >= i.

Цитата
Хранится, судя по всему, непонятно что

Возможно, там указатель на блок содержащий размер и еще что-нибудь. Например, указатель на следующий блок.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.7.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата
Хранится, судя по всему, непонятно что

Там либо мусор, либо конец чужих данных.
В VC список занятых блоков хранится отдельно. Насчет свободных точно не скажу.
Во всяком случае, если выделять последовательно блоки памяти, то вы получите адреса, идущие друг за другом плотно (учитывая размер и выравнивание).

А вот в Borland 3.1 под DOS (светлая ему память - отличный был компилятор!) каждый блок имел заголовок 4 байта с размером (2) и чем-то еще.


--------------------
...
PM   Вверх
unel
Дата 22.7.2005, 05:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











размерность размера воде байт... точнее, char

мне вот тоже кажецца что где-то он должен хранить адреса и размеры выделенной памяти .... так, а ос - ВыньДос, IDE - devcpp
  Вверх
AISIN
Дата 8.8.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



Должно все освободиться даже если указатель будет указывать на 5 или 7 ячейку. Освобождением и выделением вроде операционка должна заниматься мы тока указываем скока нам надо! Чтобы проверить все ли освобождается сделай free а потом снова malloc и сравни адреса
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
JackYF
Дата 9.8.2005, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



А зачем юзать malloc/free, когда есть new/delete ?

По-моему, во втором случае всегда размер выделенной памяти хранится в байте перед началом блока. Можно самому указать размер удаляемой области (это если указатель перемещать.)

P.S. не знаю, стандартизировано ли, но вроде везде должно быть так.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
AISIN
Дата 9.8.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



JackYF malloc - это более низкоуровневая фишка.
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
Void
Дата 9.8.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(JackYF @ 9.8.2005, 03:25)
P.S. не знаю, стандартизировано ли, но вроде везде должно быть так.

Не стандартизировано. Думаю, можно без проблем найти платформу/компилятор, где это не так.

Цитата(AISIN @ 9.8.2005, 14:56)
malloc - это более низкоуровневая фишка.

Резонный вопрос: почему?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.