C ++ управление памятью и Мисра

Мне нужно немного разъяснений по поводу управления памятью c ++ и MISRA методические рекомендации..

Мне нужно реализовать одну программу, совместимую с MISRA, поэтому я должен соблюдать важное правило: невозможно использовать оператор ‘new’ (динамическая куча памяти).

В этом случае для любого пользовательского объекта я должен использовать статическое распределение:

Например:

У меня есть свой класс Student с конструктором Student(int age),
Всякий раз, когда мне нужно создать экземпляр объекта Student, я должен сделать это следующим образом:

int theAge = 18;
Student exampleOfStudent(theAge);

Это создает объект Student exampleOfStudent.
Таким образом, мне не нужно беспокоиться о том, что я не использую деструкторы.
Это все правильно?
Есть ли другие способы использовать статическое управление памятью?
Могу ли я использовать таким же образом std :: vector или другую структуру данных?
Могу ли я добавить, например, экземпляр Student (который я создал как Student exampleOfStudent (theAge)) в std :: vector.

3

Решение

Student exampleOfStudent(theAge); это автоматическая переменная, а не статическая.

Насколько я помню, правила MISRA запрещают все формы динамической памяти. Это включает в себя как malloc а также new а также std::vector (с распределителем по умолчанию).

У вас остались только автоматические переменные и статические переменные.

Если ваша система имеет ограниченный объем оперативной памяти, вы не хотите использовать динамическую память из-за риска, что вы запросите больше памяти, чем доступно. Фрагментация кучи также является проблемой. Это мешает вам писать доказуемо правильный код Если вы используете переменные с автоматическим или статическим хранением, приложение статического анализа может, например, вывести максимальный объем памяти, который будет использовать ваше приложение. Этот номер вы можете проверить по вашей системной памяти.

4

Другие решения

Однажды я написал библиотеку, которая должна была соответствовать правилам MISRA. Мне также была нужна динамическая память, поэтому я придумал хитрость:

Моя библиотека была написана на C, но мой трюк может сработать для вас.

Часть заголовочного файла выглядела так:

/* declare two function pointers compatible to malloc and free: */
typedef void * (*allocatorFunc)(size_t size);
typedef void   (*freeFunc)     (void * data);

/* and let the library user pass them during lib-init: */
int library_init (allocatorFunc allocator, freeFunc deallocator);

Внутри библиотеки я никогда не вызывал malloc / free напрямую. Я всегда использовал поставленные функции-указатели. Поэтому я делегировал проблему, как динамическое выделение памяти должно выглядеть у кого-то другого.

Заказчику действительно понравилось это решение. Он знал о том факте, что моя библиотека не будет работать без динамического выделения памяти, и это дало ему свободу реализовывать свою собственную схему памяти, используя предварительно выделенные пулы или еще много чего.

В C ++ вы можете сделать то же самое, просто используйте функцию malloc и создайте объект с помощью размещения new.

0

Для соответствия MISRA размещение нового не является проблемой, так как не происходит динамическое распределение.
Библиотека может быть написана (как распределитель STL) таким образом, чтобы ссылаться на статически выделенную область памяти, так как это пул памяти для этой цели.
Преимущества: детерминированный, быстрый.
Недостатки: неэффективная память.
Выгодный компромисс для детерминированных систем реального времени.
Вся необходимая оперативная память должна быть там при запуске программы, иначе программа не запустится.
Если программа запускается, она не зависит от размера доступной кучи, фрагментации и т. Д.

Написание собственного распределителя может быть сложным, и все же необходимо решить условия нехватки памяти (размер пула статической памяти фиксирован).

0
По вопросам рекламы [email protected]