Asignación de memoria C ++ para arreglos

Pregunta realmente simple, pero no pude encontrar una respuesta: ¿son las siguientes 2 expresiones equivalentes en C ++ en términos de asignación de memoria?

wchar_t wide_array[10]; wchar_t* ptr_wide_array = new wchar_t[10]; 

Así que me gustaría saber: ¿siempre tengo que eliminar la matriz sin importar cómo la inicialice? O puedo beneficiarme de algún modo del scope y producir matrices en la stack que simplemente mueren sin llamar explícitamente a eliminar, ya que están fuera del scope. Y, por supuesto, ¿vale la pena usar el scope si es posible o es más seguro usar siempre eliminar?

En C / C ++, una matriz decae fácilmente [#] en un puntero a su primer elemento. Entonces *wide_array y wide_array[0] son la misma cosa. De hecho, wide_array[i] realidad se define como (o, si lo desea, es azúcar sintáctico para) (wide_array + i) . Tanto es así que i[wide_array] significa lo mismo que wide_array[i] , que es una forma divertida de ofuscar el código C / C ++ (¡pero nunca lo hagas!).

Por lo tanto, su segundo ejemplo también puede ser referenciado como ptr_wide_array[i] .

Eso es hasta donde llega la syntax. Ahora, en cuanto a lo que pasa bajo el capó:

La diferencia entre los dos ejemplos es que el primero se asigna en la stack, el segundo en el montón . Esto implica que la primera será desasignada automáticamente una vez que esté fuera del scope, pero la segunda no se desasignará hasta que se delete[] ptr_wide_array (o en otro puntero que se haya copiado de ptr_wide_array ). Esto conlleva un grave riesgo de pérdidas de memoria, especialmente si comienza a usar excepciones. En general, no use un new crudo en C / C ++. Utilice contenedores como std::vector y punteros inteligentes .

[#] Consulte esta pregunta SO para obtener una explicación de cómo se relacionan las matrices y los punteros y cómo las matrices “decaen” a los punteros.