2009-08-26 12 views
10

Muy relacionado con my previous question, pero descubrí que se trata de un problema aparte y no puedo encontrar una respuesta sólida a esto.¿La memoria de una matriz (de caracteres) se libera al salir del alcance?

¿Se ha liberado la memoria utilizada por una matriz (de caracteres) al salir del alcance?

Un ejemplo:

void method1() 
{ 
    char str[10]; 
    // manipulate str 
} 

Así que después de la llamada metodo1, es la memoria utilizada por str (10 bytes) Freed, o tengo que llamar explícitamente gratuita sobre esto también?

Mi intuición me dice que esto es solo una simple matriz de tipos primitivos, por lo que se libera automáticamente. Estoy en duda porque en C no se puede asumir nada para ser liberado automáticamente.

Respuesta

18

En este caso, no es necesario que llame sin cargo. El valor "str" ​​es un valor basado en pila que se limpiará cuando se abandone ese método/alcance particular.

Solo necesita llamar gratis a los valores que se crean explícitamente a través de malloc.

+1

(donde "no" significa - sí, está libre al salir del alcance, y no es necesario que llame gratis de forma explícita) – jmanning2k

+0

@ jmanning2k volví a leer mi publicación y la edité para que fuera un poco más claro sobre lo que "no" significó – JaredPar

1

No, las variables locales de este tipo se asignan en la pila, por lo que cuando regrese del procedimiento, la memoria estará disponible para la siguiente llamada de función, que utilizará la memoria para su estructura de pila.

Si usa malloc(), el espacio se asigna en el montón, que debe liberarse explícitamente.

9

Se libera automáticamente. Si no lo malloc, no es necesario que lo libere. Pero esto no tiene nada que ver con que sea una "matriz simple de tipos primitivos" - se liberaría si fuera una matriz de estructuras. Se libera porque es una variable local.

Dado que usted está haciendo estas preguntas básicas, tengo que preguntar qué libro de texto C está utilizando. Personalmente, no creo que pueda aprender de forma útil C sin leyendo Kernighan & Ritchie's The C Programming Language, que explica todo esto con mucha claridad.

+0

¡Excelente consejo! – Lazarus

+0

De hecho, leí (y estudié) The C Programming Language de K & R, pero eso fue hace algún tiempo y antes de que realmente "me metiera" en C yo mismo un poco más. – pbean

0

Creo que no se libera porque es primitivo, sino que es una variable local y que se asignará en la pila, no en el montón. Si no lo malloc, entonces no puedes liberarlo por lo que recuerdo.

0

Sí, se "libera" cuando se sale del alcance.
No, no tiene que liberarlo explícitamente.

La matriz de caracteres se asigna en la pila, por lo que cuando regrese de la función, ese espacio de la pila se puede reutilizar. No necesita liberar explícitamente la memoria.

Buena regla de oro: si usted malloc, debe free.

+0

La pregunta es sobre C, no C++ –

+0

Ah, sí, de hecho. Déjame arreglar eso. –

3

Sí, es "liberado". (No es gratis() 'ed, sin embargo)

Dado que str es una variable automática, solo durará tanto como su alcance, que es hasta el final del bloque de funciones.

Tenga en cuenta que solo libera() lo que malloc().

2

Sí, la memoria se libera automáticamente una vez que method1 regresa. La memoria para str se asigna en la pila y se libera una vez que se limpia el marco de pila del método. Compare esto con la memoria asignada en el montón (a través del malloc) que debe liberar explícitamente.

0

Estoy un poco oxidado en C/C++ últimamente, pero creo que tienes razón. Mientras no asigna dinámicamente esa memoria, debería estar bien.

Cuestiones relacionadas