Можно ли освободить память с помощью указателя смещения? - PullRequest
2 голосов
/ 16 июля 2010

Допустим, у меня есть выделение в памяти, содержащее строку "ABCDEFG", но у меня есть только указатель на 'E'. Возможно ли на win32 освободить этот блок, учитывая указатель, который в пределах блока, но не в начале? Любой метод распределения будет работать, но функция Heap* будет путем наименьшего сопротивления.

Если это не нативное решение, были ли написаны какие-либо специальные менеджеры памяти, предлагающие эту функцию?

РЕДАКТИРОВАТЬ: Это не повод быть небрежным. Я разрабатываю систему автоматического управления памятью, используя 100% метаданные времени компиляции. Это странное требование, кажется, единственное, что мешает его работе, и даже тогда оно необходимо только для типов данных, основанных на массивах (которые можно разрезать).

Ответы [ 3 ]

3 голосов
/ 16 июля 2010

Для подпрограмм выделения памяти в библиотеке времени выполнения было бы возможно проверить заданный адрес памяти по отношению к началу и концу каждого выделенного блока.После этого поиска было бы легко освободить блок с самого начала.

Даже при наличии хитрых алгоритмов это повлекло бы за собой какой-то поиск с каждым освобождением памяти.И почему?Просто для того, чтобы поддерживать ошибочные программы, слишком глупые, чтобы отслеживать начало выделенных блоков памяти?

Стандартная идиома языка C процветает при обработке блоков выделенной памяти как массивов.Указатель, возвращаемый из * alloc, является указателем на начало массива, и указатель может использоваться с индексами для доступа к любому элементу этого массива, индексами, начинающимися с 0. Это работало достаточно хорошо в течение 40 лет, что я не могупридумайте разумную причину для внесения здесь изменений.

1 голос
/ 16 июля 2010

Если вы используете VirtualAlloc для выделения памяти, вы можете использовать VirtualQuery, чтобы выяснить, к какому блоку относится указатель.Получив базовый адрес, вы можете передать его на VirtualFree, чтобы освободить весь блок.

1 голос
/ 16 июля 2010

Полагаю, если вы знаете, как выглядят защитные блоки malloc(), вы могли бы написать функцию, которая выполняет резервное копирование указателя, который вы передаете, до тех пор, пока он не найдет «лучшее предположение» исходного адреса памяти, а затем вызовет * 1002.*.Почему бы просто не хранить копию базового указателя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...