AG
Все записи

#️⃣2️⃣ Динамическое выделение памяти

2 min read
Embeddedпамятьheap

#️⃣2️⃣** Динамическое выделение памяти

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

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

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

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

**❓Как обнаружить
✔️ Не используются "умные" указатели (С++). Применение «умных указателей» повсеместно требует больших затрат, поэтому на практике желательно использовать простые - например, при передаче параметров. Вам нужно убедиться, что количество ссылок на объект не может стать равным нулю, пока на него ссылается обычный указатель.

✔️ Нет юнит-тестов с применением valgrind. Люди пишут код с ошибками. Все. Нужно уметь себя проверять.

✔️ Нет проверки возвращаемого значения malloc на null. Выделение памяти может завершиться ошибкой или exception.

🤔 Как действовать в таких случаях? Читайте ниже ⤵️
#IT #embedded #кейсы