4 administracion de memoria

53
Administración de Administración de Memoria Memoria Apoyo SSD5 Apoyo SSD5

Upload: uvm

Post on 12-Jun-2015

2.618 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 4 Administracion De Memoria

Administración de Administración de MemoriaMemoriaApoyo SSD5Apoyo SSD5

Page 2: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 22

ApuntadoresApuntadores

�� Un Un apuntadorapuntador es una variable que es una variable que almacena la dirección de la memoria de almacena la dirección de la memoria de otra variable.otra variable.

�� La variable La variable apuntadorapuntador es única ya que es única ya que salva la dirección de la memoria de otra salva la dirección de la memoria de otra variablevariable

�� La dirección de memoria es la localización La dirección de memoria es la localización específica en la memoria principal donde específica en la memoria principal donde existe una variable durante la ejecución de existe una variable durante la ejecución de un programaun programa

Page 3: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 33

ApuntadoresApuntadores

�� Se usan apuntadores para acceder y Se usan apuntadores para acceder y manipular indirectamente otras variables.manipular indirectamente otras variables.

�� La "La "indirecciónindirección" permite la creación de las " permite la creación de las estructuras de datos complejas y estructuras de datos complejas y algoritmos poderosos. algoritmos poderosos.

�� Por ejemplo, sin apuntadores e indirección Por ejemplo, sin apuntadores e indirección no sería posible crear una estructura de no sería posible crear una estructura de datos de la lista encadenada. datos de la lista encadenada.

Page 4: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 44

Operaciones BásicasOperaciones Básicas

�� Declaración e InicializaciónDeclaración e Inicialización�� La declaración de una variable apuntador La declaración de una variable apuntador

requiere el uso de cierta sintaxis requiere el uso de cierta sintaxis desconocida. desconocida.

�� Una declaración del apuntador debe prefijar Una declaración del apuntador debe prefijar su nombre de variable con un asterisco (*), su nombre de variable con un asterisco (*), esto significa para el compilador que la esto significa para el compilador que la variable declarada es un apuntador variable declarada es un apuntador

Page 5: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 55

Operaciones BásicasOperaciones Básicas

�� Aunque los apuntadores solamente Aunque los apuntadores solamente almacenan direcciones de la memoria, la almacenan direcciones de la memoria, la declaración de una variable apuntador declaración de una variable apuntador debe especificar un tipo de datos debe especificar un tipo de datos específico cuya dirección de memoria específico cuya dirección de memoria pueda almacenar el apuntador; esto es pueda almacenar el apuntador; esto es indispensable para poder manipular la indispensable para poder manipular la variable indirectamentevariable indirectamente

Page 6: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 66

Operaciones BásicasOperaciones Básicas

�� La inicialización requiere sintaxis nueva; La inicialización requiere sintaxis nueva; para esto se requiere obtener a dirección para esto se requiere obtener a dirección de memoria de la variable. de memoria de la variable.

�� El operador El operador addressaddress--ofof (&) regresa la (&) regresa la dirección de la memoria de donde está dirección de la memoria de donde está almacenada la variable almacenada la variable

Page 7: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 77

DeDe--referenciar (referenciar (DereferenceDereference))

�� El acceso indirecto y la manipulación de El acceso indirecto y la manipulación de variables usando apuntadores se logra variables usando apuntadores se logra usando el operador usando el operador dede--referencereference. .

�� Se aplica el operador Se aplica el operador dede--referencereference (*) (*) para acceder o modificar el valor de la para acceder o modificar el valor de la variable señalada por un apuntador. variable señalada por un apuntador.

Page 8: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 88

DeDe--referenciarreferenciar

�� Los programadores pueden invocar Los programadores pueden invocar funciones miembro de un objeto a través funciones miembro de un objeto a través de un apuntador. de un apuntador.

�� El operador de la flecha (El operador de la flecha (-->) primero de>) primero de--referencia el apuntador y en seguida referencia el apuntador y en seguida invoca la función miembro nombrada.invoca la función miembro nombrada.

Page 9: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 99

DeDe--referenciarreferenciar

�� Solamente podemos Solamente podemos dede--referenciarreferenciar de de forma segura los apuntadores que forma segura los apuntadores que señalan hacia direcciones válidas de señalan hacia direcciones válidas de memoria. memoria.

�� DeDe--referenciarreferenciar apuntadores que no se han apuntadores que no se han inicializado a direcciones de memoria inicializado a direcciones de memoria válidas causan un error de ejecución. válidas causan un error de ejecución.

Page 10: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1010

�� Una técnica utilizada para evitar este Una técnica utilizada para evitar este problema es la inicialización de variables problema es la inicialización de variables apuntador al apuntador al puntero nulo.puntero nulo.

�� El El puntero nulopuntero nulo representa un lugar en la representa un lugar en la memoria que no puede ser memoria que no puede ser dede--referenciado. referenciado.

�� Esto evita que una Esto evita que una dede--referenciación referenciación accidental pueda causar un error de accidental pueda causar un error de ejecuciónejecución

Page 11: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1111

�� El El apuntador nuloapuntador nulo es referenciado usando es referenciado usando la macro la macro NULLNULL

�� También se usan apuntadores nulos como También se usan apuntadores nulos como valores para indicar el fin de alguna valores para indicar el fin de alguna estructura o secuencia. estructura o secuencia.

Page 12: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1212

Aritmética del ApuntadorAritmética del Apuntador

�� La La aritmética del apuntadoraritmética del apuntador es el uso de es el uso de sumas y restas para cambiar la posición sumas y restas para cambiar la posición de memoria que un apuntador almacena. de memoria que un apuntador almacena.

�� Estas operaciones son concernientes a la Estas operaciones son concernientes a la posición de la memoria actualmente posición de la memoria actualmente almacenada en un apuntadoralmacenada en un apuntador

�� Si se agrega o resta un número de Si se agrega o resta un número de memoria incluyendo el tamaño requerido memoria incluyendo el tamaño requerido por el tipo de datopor el tipo de dato

Page 13: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1313

Aritmética del ApuntadorAritmética del Apuntador

�� C++ realiza esta multiplicación de C++ realiza esta multiplicación de memoria automáticamemoria automática

�� La aritmética del apuntador es una forma La aritmética del apuntador es una forma de acceder diferentes posiciones en una de acceder diferentes posiciones en una estructura de datos estructura de datos

�� La aritmética del apuntador tiene muchos La aritmética del apuntador tiene muchos usos uno de ellos es el usos uno de ellos es el recorrido de recorrido de arreglosarreglos ((traversaltraversal ofof arraysarrays).).

Page 14: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1414

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� Paso de Parámetros por Valor Paso de Parámetros por Valor �� El paso de parámetros por valor es el El paso de parámetros por valor es el

mecanismo mecanismo defaultdefault de paso de parámetros en de paso de parámetros en C++, se crea y se entrega una copia del C++, se crea y se entrega una copia del parámetro a la funciónparámetro a la función

�� Esto es importante, debido a que si Esto es importante, debido a que si realizamos un cambio a un parámetro que realizamos un cambio a un parámetro que sea pasado por valor, la variable original sea pasado por valor, la variable original permanece sin cambios ya que éstos se permanece sin cambios ya que éstos se realizan en una copia de la variable original realizan en una copia de la variable original

Page 15: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1515

Paso de Parámetros por Paso de Parámetros por ReferenciaReferencia

�� A diferencia del paso de parámetros por A diferencia del paso de parámetros por valor, no se hacen copias de las variables valor, no se hacen copias de las variables que son pasadas por referencia. que son pasadas por referencia.

�� En su lugar, una función llamada recibe En su lugar, una función llamada recibe una referencia, o alias, al parámetro real una referencia, o alias, al parámetro real provisto por la función llamada. provisto por la función llamada.

�� Por esta razón, el paso por referencia se Por esta razón, el paso por referencia se utiliza para construir funciones que utiliza para construir funciones que pueden modificar las variables en la pueden modificar las variables en la función llamada función llamada

Page 16: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1616

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� La sintaxis del paso de parámetros por La sintaxis del paso de parámetros por referencia se declara incluyendo el prefijo referencia se declara incluyendo el prefijo & en la declaración del parámetro a recibir& en la declaración del parámetro a recibir

�� Aquí el signo Aquí el signo "&""&" señala al compilador que señala al compilador que este parámetro debe ser pasado por este parámetro debe ser pasado por referencia referencia

Page 17: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1717

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� El paso de un parámetro por referencia El paso de un parámetro por referencia también se utiliza como mecanismo para también se utiliza como mecanismo para pasar objetos grandes a las funciones. pasar objetos grandes a las funciones.

�� Cuando los objetos son grandes, el paso Cuando los objetos son grandes, el paso por valor puede dar lugar a operaciones por valor puede dar lugar a operaciones que consumen demasiado tiempo al sacar que consumen demasiado tiempo al sacar copias. copias.

Page 18: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1818

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� El paso por referencia es más eficiente El paso por referencia es más eficiente porque no implica el sacar copias. porque no implica el sacar copias.

�� Incluso cuando una función no intenta Incluso cuando una función no intenta modificar uno de sus parámetros, se debe modificar uno de sus parámetros, se debe usar el paso por referencia cuando el usar el paso por referencia cuando el parámetro es un objeto grande parámetro es un objeto grande

Page 19: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 1919

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� A veces es útil pasar un apuntador por A veces es útil pasar un apuntador por referencia.referencia.

�� Esto se hace cuando una función necesita Esto se hace cuando una función necesita cambiar la posición almacenada de cambiar la posición almacenada de memoria del apuntador.memoria del apuntador.

�� Es decir se pasa un apuntador a una Es decir se pasa un apuntador a una función por referencia cuando la función función por referencia cuando la función necesita reposicionar el apuntador. necesita reposicionar el apuntador.

Page 20: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2020

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� Un error que comúnmente se comete al Un error que comúnmente se comete al regresar por referencia, es regresar una regresar por referencia, es regresar una referencia a una variable local. referencia a una variable local.

�� El ciclo de vida de una variable local El ciclo de vida de una variable local termina cuando la función en la que la termina cuando la función en la que la variable esta definida se termina de variable esta definida se termina de ejecutar.ejecutar.

Page 21: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2121

Mecanismos de paso de Mecanismos de paso de parámetrosparámetros

�� Regresar una referencia a algo que ya no Regresar una referencia a algo que ya no existe puede generar resultados existe puede generar resultados inesperados.inesperados.

Page 22: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2222

Administración de la Memoria Administración de la Memoria Dinámica Dinámica

�� El Almacén LibreEl Almacén Libre�� Cada programa de C++ tiene lo que se llama Cada programa de C++ tiene lo que se llama

el "almacén libre". el "almacén libre".

�� El almacén libre, que a veces se le llama El almacén libre, que a veces se le llama ""heapheap" es un área de la memoria de un " es un área de la memoria de un programa que se utiliza dinámicamente programa que se utiliza dinámicamente

Page 23: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2323

Administración de la Memoria Administración de la Memoria DinámicaDinámica

�� Usar memoria dinámicamente significa Usar memoria dinámicamente significa que la cantidad de memoria requerida que la cantidad de memoria requerida para una tarea es especificada en el para una tarea es especificada en el tiempo de ejecución, en lugar del tiempo tiempo de ejecución, en lugar del tiempo de compilación de compilación

�� Las variables creadas en el almacén libre Las variables creadas en el almacén libre tienen tienen dimensión dinámicadimensión dinámica. .

Page 24: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2424

Administración de la Memoria Administración de la Memoria DinámicaDinámica

�� La dimensión de una variable describe La dimensión de una variable describe cuánto tiempo permanece la variable cuánto tiempo permanece la variable alrededor en un programaalrededor en un programa

�� Las variables locales en funciones tienen Las variables locales en funciones tienen dimensión localdimensión local, se crean cuando se llama , se crean cuando se llama una función y se destruyen cuando la una función y se destruyen cuando la función regresa. función regresa.

Page 25: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2525

Administración de la Memoria Administración de la Memoria DinámicaDinámica

�� Las variables globales, que tienen Las variables globales, que tienen dimensión estáticadimensión estática son creadas y están son creadas y están disponibles a través del ciclo de vida disponibles a través del ciclo de vida completo de un programa. completo de un programa.

�� Una variable con dimensión dinámica Una variable con dimensión dinámica tiene su ciclo de vida especificado tiene su ciclo de vida especificado explícitamente por el programador. explícitamente por el programador.

Page 26: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2626

Asignación de MemoriaAsignación de Memoria

�� El proceso de obtener memoria del El proceso de obtener memoria del almacén libre es llamado almacén libre es llamado asignación de asignación de memoria.memoria.

�� El operador El operador newnew es usado en C++ para es usado en C++ para asignar memoria dinámicamente. asignar memoria dinámicamente.

// Allocate a single integer// Allocate a single integer

intint* * ptrptr = new = new intint;;

Page 27: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2727

Asignación de MemoriaAsignación de Memoria

�� El operador El operador newnew siempre regresa una siempre regresa una dirección de memoria. dirección de memoria.

�� Recuerda, los apuntadores almacenan Recuerda, los apuntadores almacenan direcciones de memoria, por lo que direcciones de memoria, por lo que nosotros debemos guardar el valor de nosotros debemos guardar el valor de regreso del operador regreso del operador newnew en el apuntadoren el apuntador

�� El operador El operador newnew sirve para todos los tipos sirve para todos los tipos de datos de datos

Page 28: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2828

Asignación de MemoriaAsignación de Memoria

�� Usando un apuntador, podemos tener Usando un apuntador, podemos tener acceso indirectamente y modificar la acceso indirectamente y modificar la variable que acabamos de crear. variable que acabamos de crear.

// Allocate a single integer// Allocate a single integer

intint* * ptrptr = new = new intint;;**ptrptr = 10;cout << "Address: " << = 10;cout << "Address: " << ptrptr << << endlendl;;

coutcout << "<< "ValueValue: " << *: " << *ptrptr << << endlendl; ;

Page 29: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 2929

Asignación de MemoriaAsignación de Memoria

�� Los objetos también pueden ser Los objetos también pueden ser asignados dinámicamente. asignados dinámicamente.

�� El operador El operador newnew, además de asignar la , además de asignar la memoria para un objeto, llamará un memoria para un objeto, llamará un constructor para el objeto constructor para el objeto

Page 30: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3030

#include <iostream>#include <cstdlib>using namespace std;class my_class {private:

int x;public:

my_class() : x(0) {}my_class(int p) : x(p) {}int value() { return x;}

};int main(int argc, char* argv[]) {

// Allocate a single object my_class* ptr1 = new my_class(4);// Allocate an array of objectsmy_class* ptr2 = new my_class[10];cout << ptr1->value() << endl;cout << ptr2->value() << endl;return EXIT_SUCCESS;

}

Page 31: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3131

Liberación de MemoriaLiberación de Memoria

�� El operador El operador deletedelete liberalibera la memoria la memoria asignada usando el operador asignada usando el operador newnew..

�� Para liberar, o Para liberar, o desasignardesasignar memoria, el memoria, el operador operador deletedelete necesita conocer qué necesita conocer qué posición en la memoria deseamos liberar. posición en la memoria deseamos liberar.

�� Para este fin, le proporcionamos un Para este fin, le proporcionamos un apuntador, que en realidad es sólo la apuntador, que en realidad es sólo la posición que obtuvimos del operador posición que obtuvimos del operador newnew

Page 32: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3232

// Dynamically allocate a variable.// Dynamically allocate a variable.

double* ptr1 = new double;double* ptr1 = new double;

// ... use the variable ...// ... use the variable ...

// The variable is no longer needed,// The variable is no longer needed,

// so we return its memory to the Free Store.// so we return its memory to the Free Store.

deletedelete ptr1; ptr1;

Page 33: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3333

Liberación de MemoriaLiberación de Memoria

�� Existe una sintaxis especial para ser Existe una sintaxis especial para ser usada por el operador usada por el operador deletedelete al liberar al liberar arreglos.arreglos.

�� La palabra reservada La palabra reservada deletedelete es seguida es seguida por el operador ([]). por el operador ([]).

�� Esto señala al ambiente de ejecución que Esto señala al ambiente de ejecución que lo que el operador lo que el operador deletedelete debe liberar es debe liberar es en realidad un arreglo, no solo una en realidad un arreglo, no solo una variable.variable.

Page 34: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3434

Constructores Constructores CopyCopy

�� Un Un constructor constructor copycopy define las acciones define las acciones que necesitan tomarse para crear una que necesitan tomarse para crear una copia de un objeto. copia de un objeto.

�� A diferencia de los constructores A diferencia de los constructores regulares, una clase puede contener solo regulares, una clase puede contener solo un constructor un constructor copycopy. .

Page 35: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3535

Constructores Constructores CopyCopy

�� Si una clase de C++ no define un Si una clase de C++ no define un constructor constructor copycopy, el lenguaje provee a la , el lenguaje provee a la clase un constructor clase un constructor copycopy por por defaultdefault. .

�� Este constructor Este constructor copycopy por por defaultdefault hace hace una copia byte por byte del objeto una copia byte por byte del objeto

Page 36: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3636

Constructores Constructores CopyCopy

�� Los constructores Los constructores copycopy son invocados cuando son invocados cuando se requiere hacer una copia de un objeto. se requiere hacer una copia de un objeto.

�� Existen tres situaciones cuando se hacen Existen tres situaciones cuando se hacen copias de objetos.copias de objetos.1.1. Durante una declaración que involucre inicializaciónDurante una declaración que involucre inicialización

2.2. Cuando los objetos son transmitidos por valorCuando los objetos son transmitidos por valor

3.3. Cuando los objetos son regresados por valorCuando los objetos son regresados por valor

Page 37: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3737

Constructores Constructores CopyCopy

�� Usar el constructor Usar el constructor copycopy defaultdefault provisto provisto por el sistema puede ser peligroso en un por el sistema puede ser peligroso en un programa que usa le memoria dinámica. programa que usa le memoria dinámica.

�� Pueden surgir situaciones donde dos o Pueden surgir situaciones donde dos o más objetos mantienen incorrectamente más objetos mantienen incorrectamente apuntadores a los mismos datos. apuntadores a los mismos datos.

Page 38: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3838

Constructores Constructores CopyCopy

�� El constructor por El constructor por defaultdefault, en el caso de , en el caso de tener apuntadores, copiará los punteros, tener apuntadores, copiará los punteros, no a lo que apuntan “no a lo que apuntan “copia superficialcopia superficial””

�� El opuesto de una copia superficial es unaEl opuesto de una copia superficial es unacopia profunda, o "copia profunda, o "deepdeep copycopy".".

Page 39: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 3939

class Array {class Array {private:private:

intint **ptrptr;;public:public:

Array(voidArray(void) : ) : ptr(newptr(new int[10]) {}int[10]) {}Array(constArray(const Array& Array& srcsrc) {) {

coutcout << "Copy Constructor Invoked!<< "Copy Constructor Invoked!\\n";n";ptrptr = new int[10];= new int[10];for (for (intint i = 0; i < 10; i++) { i = 0; i < 10; i++) {

ptr[iptr[i] = ] = src.ptr[isrc.ptr[i];];}}

}}~~Array(voidArray(void) {delete ) {delete ptrptr;};}

Page 40: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4040

Constructores Constructores CopyCopy

�� Un constructor Un constructor copycopy puede ser usado para puede ser usado para asegurar la creación de una copia asegurar la creación de una copia profunda en un objeto.profunda en un objeto.

�� El listado anterior contiene un constructor El listado anterior contiene un constructor copycopy para la clase Array.para la clase Array.

�� Este constructor Este constructor copycopy asigna un nuevo asigna un nuevo arreglo en la memoria y copia en ella los arreglo en la memoria y copia en ella los valores del arreglo fuente.valores del arreglo fuente.

Page 41: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4141

Errores ComunesErrores Comunes

�� La regla básica para tratar con la La regla básica para tratar con la asignación dinámica y la asignación dinámica y la desasignacióndesasignación o o liberación del espacio es directa: para liberación del espacio es directa: para cada llamada a cada llamada a newnew (que consume (que consume memoria), debe haber una llamada memoria), debe haber una llamada correspondiente a correspondiente a deletedelete (que libera (que libera memoria). memoria).

Page 42: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4242

Errores ComunesErrores Comunes

�� Es importante pensar cuidadosamente y Es importante pensar cuidadosamente y con anticipación donde y cuando la con anticipación donde y cuando la memoria debe ser asignada y liberada.memoria debe ser asignada y liberada.

�� No asignes memoria al azar a través del No asignes memoria al azar a través del código o dentro de funciones anidadas, código o dentro de funciones anidadas, porque esto hace difícil mantener un porque esto hace difícil mantener un registro de esas asignaciones. registro de esas asignaciones.

Page 43: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4343

Errores ComunesErrores Comunes

�� En general, los errores referentes a la En general, los errores referentes a la asignación de memoria dinámica son asignación de memoria dinámica son difíciles de tratar, y es mejor evitarlos difíciles de tratar, y es mejor evitarlos desde el principiodesde el principio

Page 44: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4444

Agotamiento de la Memoria Agotamiento de la Memoria

�� Si nunca se utiliza Si nunca se utiliza deletedelete, y se continúa , y se continúa haciendo llamadas a haciendo llamadas a newnew, el sistema en , el sistema en última instancia fallará cuando se quede última instancia fallará cuando se quede sin memoria en el almacén libre.sin memoria en el almacén libre.

�� Los Los bugsbugs o fallas de funcionamiento son o fallas de funcionamiento son llamadas llamadas ""memorymemory leaksleaks" o " o agotamiento agotamiento de la memoriade la memoria y pueden ser muy difíciles y pueden ser muy difíciles de descubrir. de descubrir.

Page 45: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4545

Agotamiento de la MemoriaAgotamiento de la Memoria

�� Una característica insidiosa de los Una característica insidiosa de los agotamientos de la memoria es que agotamientos de la memoria es que conducen a caídas aparentemente al azar conducen a caídas aparentemente al azar y fallas y fallas irreproduciblesirreproducibles..

Page 46: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4646

SobreescrituraSobreescritura

�� Al tratar con los apuntadores en C++, es Al tratar con los apuntadores en C++, es fácil a menudo sobrescribir la memoria. fácil a menudo sobrescribir la memoria.

�� Las sobre escrituras son especialmente Las sobre escrituras son especialmente molestas al usar memoria dinámica.molestas al usar memoria dinámica.

�� Esto es porque una sobre escritura en el Esto es porque una sobre escritura en el heapheap daña la información usada para daña la información usada para administrar la memoria dinámica. administrar la memoria dinámica.

Page 47: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4747

SobreescrituraSobreescritura

�� Las sobreescritura también son difíciles de Las sobreescritura también son difíciles de detectar debido a que por lo general no detectar debido a que por lo general no causan un error inmediatamente.causan un error inmediatamente.

�� Una sobreescritura puede hacer que el Una sobreescritura puede hacer que el programa falle después, en alguna otra programa falle después, en alguna otra sección del código sección del código

Page 48: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4848

SobreescrituraSobreescritura

�� Peor aún, el programa puede no fallar del Peor aún, el programa puede no fallar del todo, y continuar ejecutándose con ciertos todo, y continuar ejecutándose con ciertos datos corruptos datos corruptos

Page 49: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 4949

Uso de la Memoria Liberada Uso de la Memoria Liberada

�� Otro error común con respecto a la Otro error común con respecto a la memoria dinámica es referenciar la memoria dinámica es referenciar la memoria que ya ha sido liberada.memoria que ya ha sido liberada.

�� Nunca es seguro utilizar un apuntador Nunca es seguro utilizar un apuntador cuya posición de memoria almacenada se cuya posición de memoria almacenada se ha liberado usando ha liberado usando deletedelete

Page 50: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 5050

Uso de la Memoria LiberadaUso de la Memoria Liberada

�� El operador El operador deletedelete, por razones de , por razones de eficiencia, no limpia el contenido de la eficiencia, no limpia el contenido de la memoria que libera.memoria que libera.

�� Esto significa que existe la posibilidad de Esto significa que existe la posibilidad de que la memoria todavía pueda contener que la memoria todavía pueda contener datos válidos, tiempo después de que se datos válidos, tiempo después de que se haya liberado espacio. haya liberado espacio.

Page 51: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 5151

Uso de la Memoria LiberadaUso de la Memoria Liberada

�� No hay garantía de esto, sin embargo, la No hay garantía de esto, sin embargo, la memoria en cuestión podría ser memoria en cuestión podría ser reasignada por el sistema. reasignada por el sistema.

�� Una buena manera de evitar usar Una buena manera de evitar usar accidentalmente la memoria liberada es accidentalmente la memoria liberada es fijar el apuntador igual al apuntador nulo fijar el apuntador igual al apuntador nulo después de solicitar después de solicitar deletedelete

Page 52: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 5252

Liberación Duplicada de la Liberación Duplicada de la MemoriaMemoria

�� Solicitar Solicitar deletedelete para una posición de para una posición de memoria que ya ha sido liberada es otro memoria que ya ha sido liberada es otro error común con respecto a la error común con respecto a la administración dinámica de la memoria en administración dinámica de la memoria en C++.C++.

Page 53: 4 Administracion De Memoria

Mtl. Lourdes CahuichMtl. Lourdes Cahuich 5353

Liberación Duplicada de la Liberación Duplicada de la MemoriaMemoria

�� Esto puede parecer un error muy obvio Esto puede parecer un error muy obvio que es fácil de evitar, pero al tener un que es fácil de evitar, pero al tener un programa que tenga asignaciones y programa que tenga asignaciones y liberaciones de espacio repartidas a liberaciones de espacio repartidas a través de una base grande de código, este través de una base grande de código, este error es muy común. error es muy común.