
#️⃣2️⃣** Динамическое выделение памяти
Редко используется в embedded-разработке из-за связанных с ним проблем:
1️⃣ Фрагментация памяти. Как избежать ситуации, когда мы хотим выделить N байт памяти, но вся доступная память разбита на фрагменты размером меньше N, даже если общий объём доступной памяти намного больше N?
2️⃣ Недетерминированное поведение. Время выделения и освобождения памяти может варьироваться. Каков максимальный срок, в течение которого менеджер памяти может обработать запрос?
✳️ В отдельных случаях выделение памяти может оказаться быстрее системного вызова.
3️⃣ Накладные расходы на управление памятью. Как быть уверенными, что память освобождается менеджером памяти в нужный момент? Если освободить её слишком рано, появятся висячие указатели или ошибки двойного освобождения, а если слишком поздно - будут утечки памяти.
4️⃣ Отсутствие гарантий достаточности. Как мы можем быть уверены, что выделенной памяти достаточно, чтобы в критическом случае избежать отказа в выделении памяти?
**❓Как обнаружить
✔️ Не используются "умные" указатели (С++). Применение «умных указателей» повсеместно требует больших затрат, поэтому на практике желательно использовать простые - например, при передаче параметров. Вам нужно убедиться, что количество ссылок на объект не может стать равным нулю, пока на него ссылается обычный указатель.
✔️ Нет юнит-тестов с применением valgrind. Люди пишут код с ошибками. Все. Нужно уметь себя проверять.
✔️ Нет проверки возвращаемого значения malloc на null. Выделение памяти может завершиться ошибкой или exception.
🤔 Как действовать в таких случаях? Читайте ниже ⤵️
#IT #embedded #кейсы