БагЪ? Sys*** вызывают MemoryManager.*** а не Sys***

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

БагЪ? Sys*** вызывают MemoryManager.*** а не Sys***

Сообщение Cheb »

НЕВОЗМОЖНО построить свой диспетчер памяти как обёртку вокруг системного (например, расширяя размер блока дополнительной лабудой), поскольку системный... (фанфары)... обращается к текущему диспетчеру памяти через методы переменной MemoryManager, в которую кастомный менеджер памяти как раз установил свои функции-обёртки.

Кароч, ф-ии Sys*** вызывают MemoryManager.*** а не своих собратьев Sys*** напрямую
И любой враппер завязывается узлом, ё. :evil:
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Из своего враппера дёргаешь функции прежнего менеджера (которые ты предварительно получил GetMemoryManager) с модификацией размера блока/указателя.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

нормально все врапится...
не нравится, используй cmem
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

[рукалицо] И тут такие же умники. :evil:
Ладно, объясняю на пальцах. Для тех кому лень думать над прочитанным.

MyReallocMem добавляет к размеру +100 (условно), смещает указатель и вызывает OldMM.ReallocMem (которая на самом деле SysReallocMem)

SysReallocMem так устроена, что вызывает MemoryManager.MemSize. Которая УЖЕ мой враппер, вызывающий OldMM.MemSize, вычитающий 100 и возвращающий модифицированное значение. То есть, SysReallocMem уже получила шум океанов марса вместо того, чтобы вызвать SysMemSize напрямую и получить правильный размер расширенного блока.
После этого, SysReallocMem вызывает MemoryManager.GetMem - которая ОПЯТЬ ЖЕ мой враппер, добавляющий 100 перед вызовом OldMM.GetMem. То есть фактически мой враппер вызывается дважды, превращая структуру выделенной памяти в кашу.
Программа работает не падая только если не освобождать память, закомментировав вызов OldMM.FreeMem в MyFreeMem. Иначе при первом же освобождении косого блока, порождённого двойным применением враппера, оно валится, пытаясь освободить блок по указателю на 100 байт правее реального начала блока.

ТЕПЕРЬ - ДОШЛО? :evil:

нормально все врапится...

На практике проверял?

не нравится, используй cmem

Кстати, идея.
Ответить