· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Без памяти!

Посл.отвђт Сообщенiе


Дата: Сен 5, 2003 07:53:39

Да, у меня такая проблема.

Я создаю буфер с помощью GlobalAlloc. Начинаю складывать в него доступные видеорежимы. Дохожу до конца буфера и выполняю GlobalReAlloc. Он говорит, что не достаточно памяти.
У меня в этот момент 512Mb установлено и 300 с лишним свободно по данным системы. Я хочу выделить несчастных 2 килобайта. Все параметры у GlobalReAlloc проверял - точно.
Передаю хэндл от GlobalAlloc, 2048, флаг ZEROINIT. Не пойму, в чём дело. Сейчас попробую использовать Heap функции, но надежды мало?
Кто-нибудь знает такие приколы?


Дата: Сен 5, 2003 10:41:45

Поставь флаг:
GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)
У тебя не moveable


Дата: Сен 5, 2003 10:46:15

А какая разница между GlobalAlloc и HeapAlloc?
В MSDN пишут: Windows memory management does not provide a separate local heap and global heap. А еще: applications should use the heap functions.


Дата: Сен 5, 2003 14:47:28

Я попробовал сделать через HeapReAlloc и проблема исчезла. Хотя нет жёстких доказательств, что виноват был именно GlobalReAlloc.

К ZverA
Да мне не нужен movable. Пусть он будет фиксд. И zeroinit здесь ни при чём. Можно и без него. Дело не в этом. Я не верю, что во всех 300 метрах моей памяти нельзя найти цельный кусочек размером 2 или 4 килобайта.


Дата: Сен 5, 2003 16:53:02

А мне кажется, меньше 4 Кб все равно выделять нет смысла. Или я глубоко ошибаюсь?


Дата: Сен 5, 2003 23:46:59

> А мне кажется, меньше 4 Кб все равно выделять нет смысла. Или я глубоко ошибаюсь?

Скорее всего ошибаешся :)


Дата: Сен 6, 2003 11:57:06

Вообще-то можно выделять до 4 байт. Я проверял дебаггером в памяти. Правда это извращение.
Я вот попробовал выделять с GlobalAlloc 4 байта (с флагами GMEM_FIXED or GMEM_ZEROINIT). Он исправно обнулил 4 байта. А GlobalSize вернул его размер == 4.
Тут же выделяю 1 байт. И всё повторяется для одного байта.
Правда в памяти выделенный таким образом блок вместе со служебной информацией занимает 32 байта. А служебная информация выравнивается по 16-байтной границе.
Сами попробуйте провести такие эксперименты в любой проге и посмотрите под дебаггером, что он покажет.

ЗЫ Эти результаты были получены в WindowsXP.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075