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.