AG
Все записи

Динамическое выделение памяти в embedded

2 min read
Embeddedпамятьheap

Динамическое выделение памяти редко используется в embedded-разработке из-за связанных с ним проблем.

  1. Фрагментация памяти. Как избежать ситуации, когда мы хотим выделить N байт памяти, но вся доступная память разбита на фрагменты размером меньше N, даже если общий объём доступной памяти намного больше N?

  2. Недетерминированное поведение. Время выделения и освобождения памяти может варьироваться. Каков максимальный срок, в течение которого менеджер памяти может обработать запрос? В отдельных случаях выделение памяти может оказаться быстрее системного вызова.

  3. Накладные расходы на управление памятью. Как быть уверенными, что память освобождается менеджером памяти в нужный момент? Если освободить её слишком рано, появятся висячие указатели или ошибки двойного освобождения, а если слишком поздно - будут утечки памяти.

  4. Отсутствие гарантий достаточности. Как мы можем быть уверены, что выделенной памяти достаточно, чтобы в критическом случае избежать отказа в выделении памяти?

Как обнаружить

  • Не используются «умные» указатели (С++). Применение «умных указателей» повсеместно требует больших затрат, поэтому на практике желательно использовать простые - например, при передаче параметров. Вам нужно убедиться, что количество ссылок на объект не может стать равным нулю, пока на него ссылается обычный указатель.
  • Нет юнит-тестов с применением valgrind. Люди пишут код с ошибками. Все. Нужно уметь себя проверять.
  • Нет проверки возвращаемого значения malloc на null. Выделение памяти может завершиться ошибкой или exception.

О том, как действовать в таких случаях, - в следующем посте.