2009-02-24 8 views
5

Estoy tratando de ganar algo de ahorro de memoria en un programa C++ y quiero saber si puedo usar bloques como un alcance para las variables (como en Perl). Digamos que tengo una enorme objeto que realiza algunos cálculos y da resultado, hace que tiene sentido hacer:¿Puedo usar bloques para administrar el alcance de las variables en C++?

InputType input; 
ResultType result; 

{ 
    // Block of code 
    MyHugeObject mho; 
    result = mho.superHeavyProcessing(); 
} 

/* 
    My other code ... 
*/ 

¿Puedo esperar que el objeto que se ha destruido al salir del bloque?

Respuesta

25

Sí, puedes.

Se llamará al destructor tan pronto como la variable se salga del alcance y libere la memoria asignada en el montón.

+0

Estrictamente hablando, llamar a destructor no es lo mismo que liberar la memoria utilizada para el almacenamiento de objetos. – Constantin

+0

Creo que es seguro asumir que la palabra * enorme * en la pregunta significa que el objeto ha asignado la mayor cantidad de memoria en el montón y desea que se libere (por ejemplo, un vector). –

+0

Lo siento, pero creo que MyHugeObject está asignado en la pila y no en el montón a menos que se realice un malloc explícito. Por favor corrígeme si estoy equivocado. – 0fnt

18

Sí, absolutamente, y además de conservar memoria, llamar al destructor en la salida del osciloscopio se usa a menudo donde se quiere que el destructor realmente haga algo cuando se llama al destructor (vea RAII). Por ejemplo, para crear un bloqueo basado en el alcance y liberarlo fácilmente de una manera segura o para liberar el acceso a un recurso compartido o precioso (como un identificador de archivo/conexión de base de datos) de manera determinista.

-Rick

+0

+1 para la referencia al bloqueo basado en el alcance, un concepto muy agradable. – mghie

3

Sólo recuerde que cualquier memoria asigna en el montón de uso de las nuevas/malloc que se libera en el destructor probablemente no será lanzado de nuevo al sistema operativo. Su proceso puede retenerlo y el SO no lo recuperará hasta que el proceso finalice.

+0

Aunque en este caso la memoria está en la pila, que el sistema operativo ya se ha comprometido con su programa. (Aunque en Windows, sorprendentemente, ¡este no es siempre el caso!) –

+0

Es cierto: mi suposición era que cualquier objeto enorme objeto debe estar asignando memoria de forma dinámica internamente, incluso si está en la pila misma. – Jackson

+0

Esto no es realmente exacto. Aunque la gran cantidad de memoria seguirá asignándose a la aplicación, si no se utiliza, se eliminará de la memoria física y no obstaculizará el rendimiento de ninguna manera. Algunos sistemas operativos (Windows) administran débilmente la memoria paginada no utilizada, pero esto siempre se puede eludir utilizando un archivo mapeado en memoria y deshaciéndose de él cuando termina, ya que esto crea un archivo de página separado para ese espacio de direcciones. – SingleNegationElimination

2

Sí. Será destruido en la llave de cierre. Pero ten cuidado con la asignación de objetos muy grandes en la pila. Esto puede causar un desbordamiento de la pila. Si el objeto también asigna grandes cantidades de memoria, asegúrese de que se haya asignado un montón con nuevo, malloc o similar.

+0

Los objetos realmente apuntan a la memoria asignada en el montón, pero quiero liberarla lo antes posible. – tunnuz

Cuestiones relacionadas