![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| unel |
|
|||
|
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 |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
по идеи программа должна вывалиться, после такого Это сообщение отредактировал(а) chaos - 20.7.2005, 12:48 |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Скорее всего он сделает что-то страшное, например вылетит с Segmentation Fault. Причём не сразу. Он может вылететь при следующих обращениях к free. И тогда "Здравствуй, отладчик" Всё зависит от компилятора(который может сам организовывать менеджер памяти) и оси. malloc может вставлять размер выделенного блока в самое начало блока. То есть, чтобы узнать размер реально выделенного блока можно сделать так
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Mayk
Я точно не знаю, но мне казалось, что скорее будет храниться некий список выделенных блоков, иначе как менеджеру узнать где занятый участок, а где свободный. -------------------- Да. Именно так. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Дрон
У меня по [-1] точно размер стоит(realloc'ом проверил только что). И с отладчиком я тоже уже ни раз "мучился", когда фигню освобождал. Но это всё очень сильно зависит от реализации как оси, так и компилятора. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Круто!
И какая же ОСь и компилятор? Добавлено @ 13:29 Кстати, а какова размерность "размера"? sizeof(int) наверно? -------------------- Да. Именно так. |
||||
|
|||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Лучше бы сказал что у тебя там хранится
Ну у меня это линуха и gcc
size_t по идее. Хотя кто его знает, что производителю в голову придёт. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Mayk
Я чейчас на работе и занят соооовсем другими вещами... Но быстренько проверил в Visual Studio 2003. Язык С++. Режим Debug. Хранится, судя по всему, непонятно что Но конкретней выянсять некогда. -------------------- Да. Именно так. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Посмотрел Поросю с bcc32(не то из Builder'а, не то из free command tools, не помню уже). Там тоже, судя по всему, размер. Но realloc'ом тестить уже не стал. Просто менял размел i в выражении malloc(i). Всегда было allocated[-1] >= i.
Возможно, там указатель на блок содержащий размер и еще что-нибудь. Например, указатель на следующий блок. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Там либо мусор, либо конец чужих данных. В VC список занятых блоков хранится отдельно. Насчет свободных точно не скажу. Во всяком случае, если выделять последовательно блоки памяти, то вы получите адреса, идущие друг за другом плотно (учитывая размер и выравнивание). А вот в Borland 3.1 под DOS (светлая ему память - отличный был компилятор!) каждый блок имел заголовок 4 байта с размером (2) и чем-то еще. -------------------- ... |
|||
|
||||
| unel |
|
|||
|
Unregistered |
размерность размера воде байт... точнее, char
мне вот тоже кажецца что где-то он должен хранить адреса и размеры выделенной памяти .... так, а ос - ВыньДос, IDE - devcpp |
|||
|
||||
| AISIN |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
Должно все освободиться даже если указатель будет указывать на 5 или 7 ячейку. Освобождением и выделением вроде операционка должна заниматься мы тока указываем скока нам надо! Чтобы проверить все ли освобождается сделай free а потом снова malloc и сравни адреса
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
А зачем юзать malloc/free, когда есть new/delete ?
По-моему, во втором случае всегда размер выделенной памяти хранится в байте перед началом блока. Можно самому указать размер удаляемой области (это если указатель перемещать.) P.S. не знаю, стандартизировано ли, но вроде везде должно быть так. |
|||
|
||||
| AISIN |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
JackYF malloc - это более низкоуровневая фишка.
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Не стандартизировано. Думаю, можно без проблем найти платформу/компилятор, где это не так.
Резонный вопрос: почему? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |