MIPS - свободное динамически выделяемое пространство (куча) - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь освободить динамически выделенное пространство кучи

Я пробовал запустить этот простой код, но получаю ту же ошибку:

"запрос (-40) отрицательный. amount (syscall 9) "

.text
li $v0,9
li $a0,40
syscall

li $v0,9
li $a0,-40
syscall

Может ли кто-нибудь помочь мне понять, почему он не работает? Есть ли другой способ освободить место?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

MARS не поддерживает sbrk с отрицательными аргументами, как вы можете видеть в исходном коде здесь .

Насколько я могу судить, нет возможности явно освободить динамически выделяемая память при запуске вашего кода в MARS.

0 голосов
/ 11 июля 2020

Если вы освобождаете память кучи, используя отрицательное значение sbrk, которое в основном превращает кучу в стек, поскольку может быть возвращена только память в конце - это не совсем то, о чем куча. В куче мы хотим иметь возможность освобождать любой произвольный объект, а не только конец. 1007 *

Вы действительно можете использовать кучу как стек?

Вы можете реализовать malloc и free. Хотя они обычно довольно сложны из-за их общего назначения и соображений производительности, простой и медленный довольно легко написать, особенно если вы знаете свое приложение и его ограниченные требования.

Поистине универсальное назначение malloc / free использует структуру данных, которая собирает свободные блоки. malloc сначала ищет, что для удовлетворения запроса выдает существующий свободный блок или использует sbrk. free возвращает блок в коллекцию. (Конечно, есть еще кое-что: разделение больших блоков, объединение свободных блоков ...)

Однако, если вы правильно использовали кучу как стек, вы могли бы поддерживать два указателя, один из которых указывает, где начинается свободная память , и еще один, где он заканчивается. Освобождение последней выделенной памяти (например, sbrk(-400)) приведет к уменьшению начального указателя свободной памяти на 400. Выделение памяти увеличит начало свободной памяти на желаемое количество, а также при необходимости переместит указатель конца свободной памяти (используя sbrk из какой бы размер ни потребовался).

...