Página 1 de 1

Liberando memoria en un ordenador (pregunta técnica)

Publicado: 24 Oct 2016, 19:40
por mentalthink
Os quería hacer está pregunta, aunque más bien la tengo en mente pensando en máquinas actuales, supongo que el funcionamiento es el mismo...

La pregunta es la siguiente... cuando se libera memoria en una máquina, supongo que lo que se hace es poner a 0 las celdas de la memoria, no?¿, pero me surge una duda, si yo declaro por ejemplo int variable = 0, estoy llenando 32 bits a 0(numero de bits depende la máquina y el compilador), pero en realidad es información es un número real, el 0 existe, pero el ordenador supongo que no la trata como memoria "vacía"

Entonces mi duda es, si yo colocará un chorrón de arrays a 0, estaría consumiendo memoria, pero realidad esa memoria es como memoria liberada, está a 0... pero en realidad es el número 0, por lo que consumo la memoria del PC

Supongo que el asunto o la diferencia entre liberar memoria y dejar a 0 la memoria tiene que ver con el puntero que indica que es una variable, pero entonces tiene que haber algún tipo de información en algún sitio, esto lo desconozco totalmente.

No sé si se entiende la pregunta, espero que sí, a ver si me aclaráis un poco está pequeña duda, más que nada por curiosidad.

Re: Liberando memoria en un ordenador (pregunta técnica)

Publicado: 24 Oct 2016, 20:14
por zup
No necesariamente / ni de coña.

Cuando tu asignas memoria, se solicita al sistema operativo el uso de esa memoria; cuando la liberas, se la estás devolviendo.

Si tú simplemente la rellenas a ceros, no la estás devolviendo y seguirá marcada "en uso" hasta que tu programa finalice (se supone que entonces se limpia la memoria asignada al programa, pero no siempre se limpia todo).

Como nota relacionada, tampoco tienes garantizadas dos cosas (varía en función del sistema operativo o la runtime del lenguaje):
- La memoria que se te asigna no tiene por qué estar inicializada o rellena de ceros. En el caso de un objeto, el constructor es el que debe hacer este trabajo, en el caso de un array... pues tendrás que hacerlo manualmente.
- Cuando liberas memoria, tampoco tiene por qué rellenarse de ceros (aunque algunos sistemas lo hagan). Es un problema de seguridad, ya que otro proceso podría asignarse y leer esa memoria, con lo que podrían extraer datos como números de cuenta y esas cosas.

Regla de oro: por cada puntero que asignes, debe haber otra instrucción para liberarlo.

Y si manejas datos sensibles, borra la memoria antes de liberarla.

Re: Liberando memoria en un ordenador (pregunta técnica)

Publicado: 24 Oct 2016, 22:46
por mentalthink
Gracias zup, entonces a ver si lo he entendido.

Cuando yo digo por ejemplo (me invento los numeros , OK?¿), coge 100 Kb, entonces digamos que pongo esos 100Kb con una etiqueta, y escribo lo que sea structs, variables... etc, y cuando la libero, digamos que quito esa etiqueta, y aunque no esté a 0 puedo reescribirla, porque el ordenador o el sistema piensa que ya no es necesaria, porque he eliminado esa "etiqueta". Algo así no.

O sea asignar o liberar memoria no es poner en sí datos, es guardar localizaciones especificas para una tarea, y luego quede lo que quede el sistema sabe si puede usar esa parte que ha quedado con basura no?¿.

Por resumir que liberar memoria no es ponerlas a 0, si no dejar que otro proceso pueda escribir en esa parte.

Re: Liberando memoria en un ordenador (pregunta técnica)

Publicado: 25 Oct 2016, 00:34
por Namek
mentalthink escribió:O sea asignar o liberar memoria no es poner en sí datos, es guardar localizaciones especificas para una tarea, y luego quede lo que quede el sistema sabe si puede usar esa parte que ha quedado con basura no?¿.

Por resumir que liberar memoria no es ponerlas a 0, si no dejar que otro proceso pueda escribir en esa parte.


Ezacstamente, asignar o reservar memoria es simplemente eso, pedir al sistema un trozo de memoria sin importar que hay ahí y liberar memoria es decir al sistema que ese trozo de memoria ya no se necesita y que se puede asignar para otra cosa. Asin de fácil. :mrgreen:

Re: Liberando memoria en un ordenador (pregunta técnica)

Publicado: 25 Oct 2016, 08:48
por na_th_an
Porque, además, memoria a "0" no es memoria vacía. Un 0 es un dato como cualquier otro.

De hecho, físicamente, el concepto "memoria vacía" no tiene sentido. Sólo adquiere sentido en un grado de abstracción mayor, en el que hay un "ente superior" (que puede ser el sistema operativo, o el propio programador en el caso de máquinas más antiguas, como puede ser un ordenador de 8 bits) que lleva un registro de qué zonas están "ocupadas". Este registro es externo, no es una cualidad digamos "física" de la memoria.

Piensa en un hotel. No te puedes meter en la primera habitación que veas que no hay nadie, porque eso no significa que esté libre. Hay un registro de habitaciones en el que se reserva una habitación, y esta habitación no la puede utilizar nadie más hasta que se libere.

Re: Liberando memoria en un ordenador (pregunta técnica)

Publicado: 25 Oct 2016, 12:23
por mentalthink
Gracias a todos, es lo que comentaba en el primer post na-th-an, yo recordaba o eso pensaba que dejar la memoria libre era ponerla a 0, pero claro el 0 es un número como cualquier otro, en binario es lo mismo que poner cualquier número, de ahí que me estaba armando un poco de follón.

Gracias a todos como siempre por las respuestas.