Если вы освобождаете память кучи, используя отрицательное значение sbrk
, которое в основном превращает кучу в стек, поскольку может быть возвращена только память в конце - это не совсем то, о чем куча. В куче мы хотим иметь возможность освобождать любой произвольный объект, а не только конец. 1007 *
Вы действительно можете использовать кучу как стек?
Вы можете реализовать malloc
и free
. Хотя они обычно довольно сложны из-за их общего назначения и соображений производительности, простой и медленный довольно легко написать, особенно если вы знаете свое приложение и его ограниченные требования.
Поистине универсальное назначение malloc
/ free
использует структуру данных, которая собирает свободные блоки. malloc
сначала ищет, что для удовлетворения запроса выдает существующий свободный блок или использует sbrk. free
возвращает блок в коллекцию. (Конечно, есть еще кое-что: разделение больших блоков, объединение свободных блоков ...)
Однако, если вы правильно использовали кучу как стек, вы могли бы поддерживать два указателя, один из которых указывает, где начинается свободная память , и еще один, где он заканчивается. Освобождение последней выделенной памяти (например, sbrk(-400)
) приведет к уменьшению начального указателя свободной памяти на 400. Выделение памяти увеличит начало свободной памяти на желаемое количество, а также при необходимости переместит указатель конца свободной памяти (используя sbrk
из какой бы размер ни потребовался).