2010-05-03 10 views
5

Digamos que tengo algo así como ...matriz C++ estática que conduce a la pérdida de memoria?

void foo() 
{ 
    char c[100]; 
    printf("this function does nothing useful"); 
} 

Cuando se llama foo, se crea la matriz en la pila, y cuando se sale del ámbito, es la memoria cancela la asignación de forma automática? ¿O se destruye c, pero la memoria permanece asignada, sin forma de acceder a ella/recuperarla, excepto reiniciar la computadora?

+0

Esto no es una matriz estática. Es solo una matriz local (asignada por pila). –

Respuesta

6

¿la memoria se desasigna automáticamente?

Sí. Y los destructores serán llamados también, en caso de que te lo preguntes. Es por eso que están en el automatic storage class.

(En realidad para la mayoría de las arquitecturas del programa será única llamada que 100 destructores (si lo hay), y luego desplazar el puntero de pila hacia atrás 100 * sizeof(T) bytes como "cancelación de asignación".)

+0

Ok. Gracias por todos los que respondieron. Estaba seguro acerca de usar new/delete, pero alguien me había dado la impresión de que lo que había publicado no sería desasignado. ¿Cómo terminas en una situación en la que un puntero se elimina (cuando se sale del alcance), pero los datos a los que apunta siguen asignados (inaccesibles también)? – MDonovin

+0

@MDonovin: Vea la respuesta de mmr http://stackoverflow.com/questions/2758970/c-static-array-leading-to-memory-leak/2758985#2758985. – kennytm

0

Se ha ido - todo se ha ido.

Pero la memoria está disponible para su uso con la siguiente función inmediatamente. la pila simplemente se implementa como un puntero, cuando haces c [100] mueve el puntero hacia abajo 100 bytes para que la siguiente memoria solicitada aparezca después de c. Cuando sale de la función, el puntero de la pila simplemente vuelve a la posición anterior antes de ingresar a la función. Esta es una forma muy rápida y eficiente de administrar la memoria en comparación con new/delete/malloc

4

En ese caso, sí, la memoria está desasignada. Si hubiera hecho algo como:

int var = 100; 
char* c = new char[var]; 

Entonces, eso quedaría atrás una vez que la función haya finalizado.

¡Sin embargo! No tiene que reiniciarse para recuperar la memoria perdida en un sistema operativo moderno. En cambio, la memoria se devolverá una vez que finalice el proceso (programa).

3

Para ser claros, en realidad no hay una asignación de memoria aquí; hay una asignación de la pila teniendo lugar. La diferencia es significativa porque la primera requiere una llamada de función, reservando memoria del sistema de asignación y un host de sobrecarga. Por el contrario, lo último implica simplemente incrementar el puntero de la pila. Las asignaciones de pila son siempre mucho, mucho más rápidas y, excepto en los casos de errores que involucran corrupción de pila, siempre se limpian cuando se cierra la función.

Cuestiones relacionadas