C свободной памяти в стеке - PullRequest
0 голосов
/ 28 ноября 2018

Я создал несколько утилит, которые помогают мне управлять DinamicList.В разделе, который я использую для обработки удаления элемента в списке, если есть добавленный элемент, который хранится в стеке, когда я вызываю free(), достигается неопределенное поведение.

Серфинг наВ сети я обнаружил, что нет способов определить, указывает ли указатель на стековую память или кучную память.

Поэтому я думаю, что для решения этой проблемы мне нужно обработать ошибку, сгенерированную из free().Есть ли способ обработать это исключение, когда я звоню free()?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

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

В некоторых системах распределения функция, которая освобождает память, принимает аргумент, указывающий, сколько памяти освобождается;другие могут требовать, чтобы каждый пул использовался только для распределения объектов фиксированного размера.Некоторые системы, которые делают такие вещи, позволят коду добавить любой кусок памяти, который не понадобится программе для каких-либо других целей, в пул, просто «освободив» его, диспетчер памяти будет знать или заботиться о том, пришла ли память избассейн в первом случае.Действительно, в некоторых таких системах, в первую очередь, могут создаваться пулы: инициализировать дескриптор для пустого пула памяти, а затем «выпустить» в него порции хранилища, как это удобно.

Такой подхододнако добавление хранилища в пул памяти не может работать в C, поскольку единственный способ «освободить» может знать, сколько памяти добавить в пул, - это использовать информацию, которая была где-то сохранена «malloc».Как правило, информация хранится в пространстве непосредственно перед хранением, которое malloc () предоставляет приложению.Если указатель не был создан malloc(), хранилище, непосредственно предшествующее хранилищу, описанному указателем, не будет содержать информацию, необходимую для malloc (), но, скорее всего, будет содержать шаблон байтов, который выглядит так, как будто он был созданвыделение какого-то бессмысленного размера.Это может привести к тому, что диспетчер памяти будет делать все, что ему захочется, с большим объемом памяти, который, вероятно, выйдет за пределы объекта, адрес которого был ему передан.Веселость, вероятно, наступит, когда менеджер памяти примет приложение по этому приглашению.

0 голосов
/ 28 ноября 2018

Нет.

Вам не нужно звонить free() для указателей без кучи.Самый простой способ - позволить тому, кто выделил память, позаботиться о ее освобождении.Т.е. ваши утилиты присматривают за памятью, которую они выделяют, но кто-то еще присматривает за памятью, переданной вашим утилитам.

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