¿Hay casos de uso válidos para usar punteros nuevos y eliminados, o matrices de estilo c con C ++ moderno?

Aquí hay un notablevideo (Deja de enseñar C) sobre ese cambio de paradigma para tomar en la enseñanza del lenguaje c ++.

Y una publicación de blog también notable

Tengo un sueño ...

Estoy soñando con los llamados cursos / clases / currículos de C ++ que dejarán de enseñar (requieren) que sus estudiantes usen: ...

Desde C ++ 11 como estándar establecido tenemos elGestión de memoria dinámica instalaciones akapunteros inteligentes.
Incluso de estándares anteriores tenemos el estándar c ++Biblioteca de contenedores como un buen reemplazo para las matrices sin procesar (asignadas connew T[]) (especialmente el uso destd::string en lugar de estilo cNUL matrices de caracteres terminadas).

Pregunta (s) ennegrita:

Deje de lado la colocaciónnew anular,¿Hay algún caso de uso válido que no se pueda lograr con punteros inteligentes o contenedores estándar, sino solo connew ydelete directamente (además de la implementación de tales clases de contenedor / puntero inteligente, por supuesto)?

A veces esrumoreado (me gustaaquí oaquí) que usandonew ydelete enrollado a mano puede ser"más eficiente" para ciertos casos¿Cuáles son estos en realidad? ¿No es necesario que estos casos extremos realicen un seguimiento de las asignaciones de la misma manera que los contenedores estándar o los punteros inteligentes deben hacer?

Casi lo mismo para las matrices de tamaño fijo sin formato de estilo c: haystd::array hoy en día, lo que permite todo tipo de tareas, copias, referencias, etc., de manera fácil y sintácticamente coherente, como todos esperan.¿Hay algún caso de uso para elegir unT myArray[N]; matriz de estilo c en preferencia destd::array<T,N> myArray;?

Con respecto a la interacción con bibliotecas de terceros:

Se supone que una biblioteca de terceros devuelve punteros sin formato asignados connew me gusta

MyType* LibApi::CreateNewType() {
    return new MyType(someParams);
}

siempre puede ajustarlo a un puntero inteligente para asegurarse de quedelete se llama:

std::unique_ptr<MyType> foo = LibApi::CreateNewType();

incluso si la API requiere que llame a su función heredada para liberar el recurso como

void LibApi::FreeMyType(MyType* foo);

aún puede proporcionar una función de eliminación:

std::unique_ptr<MyType, LibApi::FreeMyType> foo = LibApi::CreateNewType();

Estoy especialmente interesado en válido"cada día" casos de uso en contraste conpropósito académico / educativo requisitos y restricciones, que no están cubiertos por las instalaciones estándar mencionadas.
Esenew ydelete puede usarse en marcos de gestión de memoria / recolector de basura o la implementación de contenedor estándar está fuera de discusión1.

Una gran motivación ...

... hacer esta pregunta es dar un enfoque alternativo frente a cualquier pregunta (tarea), que está restringida a usar cualquiera de los constructos mencionados en el título, pero preguntas serias sobre el código listo para producción.

A menudo se les conoce comolo esencial de gestión de memoria, que es IMO descaradamente errónea / malentendida como adecuada paraprincipiantes conferencias y tareas.

1)Añadir.: Con respecto a ese párrafo, este debería ser un indicador claro de quenew ydelete no es para estudiantes principiantes de c ++, pero debe dejarse para los cursos más avanzados.

Respuestas a la pregunta(19)

Su respuesta a la pregunta