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

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

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

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

Сообщение Cheb » 01.03.2017 11:27:46

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

Кароч, ф-ии Sys*** вызывают MemoryManager.*** а не своих собратьев Sys*** напрямую
И любой враппер завязывается узлом, ё. :evil:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

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

Сообщение kazalex » 01.03.2017 13:31:21

Из своего враппера дёргаешь функции прежнего менеджера (которые ты предварительно получил GetMemoryManager) с модификацией размера блока/указателя.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение olegy123 » 01.03.2017 13:45:27

нормально все врапится...
не нравится, используй cmem
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение Cheb » 01.03.2017 14:04:42

[рукалицо] И тут такие же умники. :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

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 23

Рейтинг@Mail.ru