Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo
de la
Memoria Dinmica**
Clase 10.
Fernando Edgar Daz-Prado
UNIVERSIDAD REGIOMONTANA
OTOO - 2015
Asignacin Dinmica
Asignacin Dinmica es la creacin de un
objeto mientras el programa est en
ejecucin. Para ello se usa el operador new.
Los objetos creados con memoria dinmica
son almacenados en una gran espacio de
memoria libre llamado heap ( pila ).
Cuando son creados de esta manera, los
objetos permanecen en el heap hasta que
son removidos de l.
EL operador delete borra los objetos del heap.
2
Creando un Objeto
Usando el operador new, creamos un objeto entero en
el heap y asignamos su direccin a P.
// assign a value
Student * MakeStudent()
{
Student * pS = new Student;
return pS;
}
(mas)
7
Recibiendo un puntero
(continuacin)...
El que llama la funcin puede recibir una direccin y
almacenarla en una variable puntero. El puntero
permanece activo mientras el objeto Student esta
accesible (no ha sido borrado).
Student * pS;
pS = MakeStudent();
// now pS points to a Student
Invalidacin de Punteros
Un puntero se invalida cuando el objeto referenciado
es borrado y luego tratamos de usar ese puntero. Esto
puede generar un error de ejecucin irrecuperable.
// check it first...
10
/* C */
11
Punteros Constantes
La declaracin de un puntero constante slo garantiza
que el puntero en si no puede ser modificado.
Arreglos y Punteros
EL nombre de un arreglo es compatible en
asignaciones con un puntero al primer elemento de un
arreglo . Por ejemplo, *p contiene scores[0].
int scores[50];
int * p = scores;
*p = 99;
cout << scores[0];
p++;
scores++;
// "99"
// ok
// error: scores is const
14
Recorriendo un Arreglo
Programadores C y C++ frecuentemente usan punteros
para recorrer arreglos. Hoy da el acceso va ndices
corre tan eficientemente como el recorrido con
punteros debido a la optimizacin hechas hoy por
compiladores.
int scores[50];
int * p = scores;
for( int i = 0; i < 50; i++)
{
cout << *p << endl;
p++;
// increment the pointer
}
Actualmente el cdigo con recorrido con ndice es
tambin eficiente.
15
Arreglos de Punteros
Un arreglo de punteros usualmente contiene la
direccin de objetos dinmicos. Esto ocupa poco
almacenamiento para el arreglo y mantiene la mayor
parte de los datos en el heap.
Student * cop3337[10];
for(int i = 0; i < 10; i++)
{
cop3337[i] = new Student;
}
diagrama
16
Arreglo de Punteros
Stack
cop3337 [ ]
Heap
Student
Student
Student
Student
Student
Student
Student
Student
Student
Student
17
Creacin de un Arreglo en el
heap
Podemos crear arreglos completos en el heap usando
el operador new. Hay que recordar eliminarlo cuando
corresponda. Para ello basta incluir "[ ]" antes del
nombre del arreglo en la sentencia delete.
array size
void main()
{
double * samples = new double[10];
// samples is now an array....
samples[0] = 36.2;
delete [] samples;
//eliminacin de un arreglo
}
18
Punteros y Clases
Los punteros son efectivos cuando los encapsulamos
en clases porque podemos controlar su tiempo de vida.
class Student {
public:
Student();
~Student();
private:
string * courses;
int count;
};
// mas...
19
Punteros en Clases
El constructor crea el arreglo, y el destructor lo borra.
De esta forma pocas cosas pueden salir mal ...
Student::Student()
{
courses = new string[50];
count = 0;
}
Student::~Student()
{
delete [] courses;
}
20
Punteros en Clases
...excepto cuando hacemos una copia de un objeto
Student, el constructor de copia de C++ conduce a
problemas.
Por ejemplo aqu un curso asignado al estudiante X
termina en la lista de cursos del estudiante Y:
Student X;
Student Y(X);
// construct a copy
X.AddCourse(Progra-3 326");
cout << Y.GetCourse(0);
// Progra-3 326"
21
Punteros en Clases
Para prevenir este tipo de problemas, creamos un
constructor de copia que efecta lo conocido como una
copia en profundidad.
22
Punteros en Clases
Por la misma razn, tenemos que sobrecargar
(overload) el operador de asignacin.
Student & Student::operator =(const Student & S2)
{
delete [] courses;
// delete existing array
count = S2.count;
for(int i = 0; i < count; i++)
courses[i] = S2.courses[i];
return *this;
}
23
2:
http://people.engr.ncsu.edu/efg/210/s99/Notes/pointers.html
3:
https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_cpp_dynamic-memory.php
4:
http://www3.nd.edu/~zxu2/acms60212-40212/Lec-dynamic-memory.pdf
24
25