В последнее время я узнал, что среди программистов C ++ существует консенсус, что операторов new
, delete
и delete[]
следует избегать как можно чаще, как уже обсуждалось здесь , здесь или здесь . При поиске я даже наткнулся на апрельскую шутку о том, что эти операторы устаревают в C ++ 20.
Я пишу и поддерживаю программу на C / C ++, написаннуюна таком языке, чтобы продолжать использовать полезные библиотеки и классы, написанные другими программистами. Поскольку он должен работать в довольно ограниченных средах (то есть в старых дистрибутивах Linux с минимальным количеством программ), я не могу полагаться на функции, представленные в C ++ 11 и более поздних версиях (например, умные указатели )), и я до сих пор придерживался сочетания навыков программирования на C и Java при расширении своей программы. Среди прочего, я довольно часто использовал динамическое распределение с new
и delete
- что, конечно, является проблемой.
Чтобы облегчить обслуживание моего кода будущими программистами, яхотел бы свести к минимуму динамическое распределение с указанными ключевыми словами в моем коде. Проблема в том, что моя программа должна управлять некоторыми довольно большими структурами данных, используемыми (почти) для всего выполнения. Как следствие, я изо всех сил пытаюсь выяснить, почему я должен избегать динамического выделения в этих ситуациях.
Для упрощения рассмотрим, у меня есть структура данных (смоделированная как объект) стоимостью 10 мегабайт, которая используется для всего выполненияпрограммы и который размер в памяти может увеличиваться со временем. Мои вопросы следующие:
Является ли динамическое размещение объекта с new
все еще плохой практикой в данном конкретном контексте? Какие есть лучшие альтернативы?
Предположим, теперь я где-то в своей программе создаю экземпляр нового объекта без использования new
, выполняю над ним некоторые операции, которые могут немного изменить его размер, затем используюспособ вставить его в мою структуру данных. Как это работает с памятью, если используется автоматическое распределение (как упоминалось здесь )?
Большое спасибо заранее.