Здесь заметный видео (Остановить обучение C) об изменении этой парадигмы, чтобы принять участие в обучении языку С++.
А также заметное сообщение в блоге
Я мечтаю о так называемых курсах/классах С++/куррикулумах, которые перестанут преподавать (требуя) своих учеников:...
Так как С++ 11 в качестве стандартного стандарта, мы имеем Управление динамической памятью, а также интеллектуальные указатели. < ш > Даже из более ранних стандартов у нас есть стандартная std::string
вместо c-style NUL
завершенных массивов символов).
Вопрос в жирный:
Отмените переопределение места размещения new
, , есть ли какой-либо допустимый прецедент, который не может быть достигнут с помощью интеллектуальных указателей или стандартных контейнеров, но только с использованием new
и delete
непосредственно (кроме реализация таких классов контейнера/умных указателей, конечно)?
Иногда он по слухам (например здесь или здесь), что с помощью new
и delete
с ручным управлением может быть "более эффективным" для определенных случаев. Каковы они на самом деле?. Разве эти краевые случаи не должны отслеживать распределения так же, как стандартные контейнеры или интеллектуальные указатели?
Почти то же самое для необработанных массивов фиксированного размера c-стиля: в настоящее время существует std::array
, что позволяет легко и синтаксически выполнять все виды присвоения, копирования, ссылки и т.д., как и ожидалось всеми. Есть ли какие-либо варианты использования T myArray[N];
массива c-style в предпочтении std::array<T,N> myArray;
?
Относительно взаимодействия с сторонними библиотеками:
Предположим, что сторонняя библиотека возвращает исходные указатели, выделенные с помощью new
, например
MyType* LibApi::CreateNewType() {
return new MyType(someParams);
}
вы всегда можете привязать это к умному указателю, чтобы гарантировать, что вызывается delete
:
std::unique_ptr<MyType> foo = LibApi::CreateNewType();
даже если API требует, чтобы вы вызывали свою устаревшую функцию, чтобы освободить ресурс, например
void LibApi::FreeMyType(MyType* foo);
вы все равно можете предоставить функцию дебетера:
std::unique_ptr<MyType, LibApi::FreeMyType> foo = LibApi::CreateNewType();
Меня особенно интересуют действительные "повседневные" варианты использования, в отличие от требований академического/образовательного назначения и ограничений, которые не охватываются указанными стандартными средствами.
То, что new
и delete
может быть использовано в фреймворках управления памятью/сборщиками мусора или стандартная реализация контейнера, не может быть и речи 1.
Одна главная мотивация...
... задавать этот вопрос - дать альтернативный подход к любым (домашним заданием) вопросам, которые ограничены использованием любых конструкций, упомянутых в названии, но серьезных вопросов о готовом коде производства.
Они часто упоминаются как основы управления памятью, которые IMO явно ошибочно/неправильно поняты, подходящие для лекций и задач для начинающих.
1) Добавить.: Что касается этого абзаца, это должен быть ясный индикатор того, что new
и delete
не для начинающих С++ студентов, но его следует оставить для более продвинутых курсов.