Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2010, 14:32   #1
Nubilius
 
Регистрация: 19.12.2010
Сообщений: 3
По умолчанию Узнать адрес кучи (визуализация работы с памятью).

Пишу курсовую - визуализация операций по работе с памятью (выделение памяти в кучи, освобождение, и т.д.). Первая мысль, которая пришла в голову - рисовать как в старых дефрагментаторах, в виде цветных квадратиков (разные куски памяти - разными цветами), а положение квадратика вычислять относительно начала кучи в памяти по адресу нового куска.
И тут засада... а собственно, можно ли узнать начальный и максимальный адреса кучи, а если реально - то как? Она ведь может лежать не в сплошным куском в памяти?
Nubilius вне форума Ответить с цитированием
Старый 19.12.2010, 15:22   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
И тут засада... а собственно, можно ли узнать начальный и максимальный адреса кучи, а если реально - то как?
Простите, что?
BOBAH13 вне форума Ответить с цитированием
Старый 19.12.2010, 15:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так понимаю автору хочется использовать GetProcessHeap для получения кучи
ну и размер:
Цитата:
The HeapSize function returns the size, in bytes, of a memory block allocated from a heap
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.12.2010, 16:35   #4
Nubilius
 
Регистрация: 19.12.2010
Сообщений: 3
По умолчанию

Размер получить не проблема, речь шла вот о чем... Скажем, выделяю я отдельную кучу, максимальный и начальный размер 8 мб. Содержимое кучи идёт в памяти подряд, от начало и до конеца, или куча может быть фрагментирована в памяти? (кусочек кучи здесь, кусочек там...)

Просто раздумываю, как визуально нарисовать относительное положение выделения новых кусков кучи.
Nubilius вне форума Ответить с цитированием
Старый 19.12.2010, 18:24   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
куча может быть фрагментирована в памяти
Уж на то она и куча... Впрочем я слышал что есть какое-то менеджеры памяти, которые дефрагментируют кучу, собирая ее... Правда не помню к каким компиляторам это относится...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.12.2010, 10:58   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Nubilius Посмотреть сообщение
Содержимое кучи идёт в памяти подряд, от начало и до конеца, или куча может быть фрагментирована в памяти?
если ты выделяешь кучу через функцию HeapCreate, то изначально резервируется сплошной кусок памяти размер которой равен dwInitialSize. Потом при каждом вызове функции HeapAlloc происходит поиск подходящего участка памяти в этом буфере. В случае если памяти не хватает, то происходит увеличение кучи и вот после этого нет гарантии на то что в результате весь буфер отведённый под кучу будет сплошным (новый кусок памяти может выделен как рядом с начальным так и где-то "на расстоянии" от него).

Цитата:
Сообщение от Nubilius Посмотреть сообщение
Пишу курсовую - визуализация операций по работе с памятью (выделение памяти в кучи, освобождение, и т.д.).
вообще функции для работы с кучами HeapCreate, HeapAlloc, HeapFree (по моему опыту) редко используются. Сколько исходников не смотрел как на С++ так и на delphi, чаще всего используются собственные реалитзации менеджеров куч.
Сам лично дизассемблировал код операторов new языка C++, всё происходит вручную. Всегда есть заранее подготовленный буфер памяти из которого выделяет память оператор new. Аналогично с malloc. Аналогично операторы new(), GetMem, GetMemory в Delphi
Программа сама вручную выделяет кусок памяти через функцию VirtualAlloc (где-то при запуске программы) и сама распределяет его между объектами программы или другими данными.

Последний раз редактировалось rpy3uH; 20.12.2010 в 11:00.
rpy3uH вне форума Ответить с цитированием
Старый 02.01.2011, 09:16   #7
Nubilius
 
Регистрация: 19.12.2010
Сообщений: 3
По умолчанию

Цитата:
вообще функции для работы с кучами HeapCreate, HeapAlloc, HeapFree (по моему опыту) редко используются. Сколько исходников не смотрел как на С++ так и на delphi, чаще всего используются собственные реалитзации менеджеров куч.
Полностью согласен, но у меня суть курсовой именно в написании велосипеда (весь критичный функционал должен быть на голом WinAPI). Что поделаешь, такова задача )

Всем большое спасибо, всю необходимую информацию я получил, тему можно закрывать !
Nubilius вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка работы с памятью Alex Cones Общие вопросы Delphi 4 04.12.2010 06:45
Визуализация работы макроса Gawwws Microsoft Office Excel 24 01.09.2010 18:16
Визуализация работы последовательного порта Vohakisa Помощь студентам 1 01.05.2010 19:30
Визуализация работы макроса zander Microsoft Office Excel 7 15.02.2009 01:09
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39