Создайте отдельные кучи в C - PullRequest
3 голосов
/ 10 июня 2019

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

Мы используем сторонний инструмент для создания пула кучи при входе в функцию. Следовательно, любое динамическое выделение памяти будет из этого пула кучи. Если таймер срабатывает, мы просто освобождаем этот пул кучи, и код продолжает работать с пулом кучи до него (это похоже на стек пулов).

Нам нужно прекратить использование этого стороннего инструмента из-за стоимости.

Есть ли у кого-нибудь идея решения этой проблемы, чтобы заменить этот сторонний инструмент?

Примечание: это не многопоточная система.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

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

Конечно, это потребует глубокого погружения в работу malloc и free.И вам нужно будет знать, как и какая информация хранится в заголовке памяти.

1 голос
/ 10 июня 2019

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

...