¿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
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.
... 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.