Sei sulla pagina 1di 26

Gestión de Memoria Dinámica

Ing. Ronald Pérez

ronperez@ucab.edu.ve
ronaldrr@cantv.net
ronaldperezr@hotmail.com

Programación II
Creación de Objetos

La creación de un objeto en C++ tiene lugar


en dos pasos:
1. Asignación de memoria para el objeto
2. Llamada al constructor.

Programación II
Operador new

Cuando se crea un objeto mediante el operador


new, éste se encarga de obtener el espacio
necesario para el objeto y de llamar a su
constructor

Primero asigna espacio, que se haya


recuperado correctamente y utilizando el
puntero this, hace la llamada al constructor
adecuado.

Programación II
Operador new
En las expresiones con new se puede usar
cualquiera de los constructores disponibles para
una clase.

Si éste no tiene argumentos, se escribe la


expresión sin la lista de argumentos

La creación dinámica de objetos es muy simple:


una única expresión realiza el trabajo de cálculo
de tamaño, asignación, comprobaciones de
seguridad y conversión de tipo.

Programación II
Operador delete
Delete primero llama al destructor y después libera la
memoria. El argumento para el delete debe ser una
dirección: Puntero a objeto creado con new.

El uso del operador delete debe reservarse solo para los


objetos que hayan sido creados mediante new.

No ocurre nada si el puntero que se le pasa a delete es


nulo. Por esa razón, a menudo se recomienda asignar
cero al puntero inmediatamente después de usar delete;
se evita así que pueda ser usado de nuevo como
argumento para delete.

Programación II
Gestión de Memoria
El compilador conoce con exactitud el tipo, la
cantidad y el ámbito de los objetos automáticos que
se crean en la pila.

El espacio asignado a los objetos y su duración


queda bien definido en el código que genera.

Se requiere mayor gasto tanto en tiempo como en


espacio para la creación dinámica de objetos.

Hay que buscar un hueco en la memoria que esté


disponible para el objeto que estamos creando.

Programación II
Delete void*: Mal asunto

Programación II
Creación Dinámica de Objetos
Operadores new y delete con arrays.
En C++ se pueden crear vectores de objetos ya
sea en la pila o en el head, con la certeza de que
se producirá la llamada al constructor para cada
uno de los objetos del vector.
Hay una restricción: debe existir un constructor
por defecto, o sea, sin argumentos, que es el
que será llamado para cada objeto.

Programación II
Creación Dinámica de Objetos
Operadores new y delete con arrays.

En el segundo caso ocurre lo mismo que en el primero:


Se llama al destructor del elemento apuntado.
En el segundo caso nos estamos olvidando de llamar a
los destructores de 99 objetos.

Sin embargo, sí se liberará toda la memoria asignada al


vector, ya que fue obtenida como un único gran bloque
cuyo tamaño quedó anotado en alguna parte por las
rutinas de asignación.

Programación II
Clase String
El ANSI proporsiona una clase string que evita
muchos problemas asociados a vectores de
caracteres simples (char * o char[]). Se puede
definir un objeto de la clase string de una forma
muy simple, tal y como se muestra en este
ejemplo:

Programación II
Clase String
Funciones miembros: la clase string tiene
muchas funciones miembros. Algunas funciones
básicas se describen a continuación:
Inicialización Un objeto string se puede definir sin un valor de inicialización,
(constructor) en ese caso su valor inicial es una cadena vacía (longitud cero,
ningún carácter):
string str1;
Un objeto de la clase string se puede también
inicializar con
• una expresión string:
string str2 = str1;
string str3 = str1 + str2;
string str4 (str2); // forma alternativa a string str4 =
str2;

Programación II
Clase String
• una cadena de caracteres constante:
string str4 = "hola allí";
string str5 ("adiós"); // forma alternativa a string str5
= "adiós";
• un único carácter
Desafortunadamente, los métodos previstos no
funcionan:
string str6 = ' A'; // incorrecto
Inicialización string str7 ('A'); // también incorrecto
(constructor) • En su lugar, debemos utilizar una forma especial con
dos valores:
string str7 (1, 'A'); // correcto
Los dos valores son: la longitud deseada de la cadena
y un carácter para llenar la cadena. En este caso,
estamos pidiendo una cadena de longitud uno,
rellenada con el carácter A.
• una subcadena de otro objeto string:
string str8 = "ABCDEFGHIJKL", str9(str8, 2, 9);

Programación II
Clase String
size_type length() const;
size_type size() const;
Ambas funciones devuelven la longitud (número de
caracteres) del string. El tipo devuelto size_type es un
tipo entero sin signo. (el nombre
length del tipo generalmente debe tener el nombre de la
clase con el operador de alcance,
size como en string::size_type .)

string str = "hola";


string::size_type len;
len = str.length(); // len == 4
len = str.size(); // len == 4

Programación II
Clase String
const char * c_str();
Se utiliza para poder compatibilizar el nuevo tipo de dato con el
antiguo char *
c_str string filename; cout << "introduce nombre del archivo: "; cin >>
filename; ofstream
outfile (filename.c_str()); outfile << "datos" << endl;
string::pos insert(string::size_type pos, const string& s);

Inserta un string en el objeto string actual, comenzando


en la posición pos especificada.
insert
string str11 = "abcdefghi";
string str12 = "0123";
str11.insert (3, str12);
cout << str11 << endl; // "abc0123defghi"
str12.insert (1, "xyz");
cout << str12 << endl; //"0xyz123"

Programación II
Clase String
string::pos erase(string::size_type pos, size_type n);

Suprime una subcadena de longitud n del string actual a


erase partir del carácter de la posición pos .

string str13 = "abcdefghi"; str13.erase (5,3); cout <<


str13 << endl; //"abcdei"
string::pos replace(size_type pos, size_type n, const
string &s);

Suprime la subcadena que empieza en el carácter de la


replace posición pos del string actual y con longitud n, y la
substituye por la cadena s

string str14 = "abcdefghi"; string str15 = "XYZ";


str14.replace (4,2,str15);
cout << str14 << endl; // "abcdXYZghi"

Programación II
Clase String
size_type (const string &str, size_type posicion);

Busca la primera ocurrencia de str en la cadena actual,


find comenzando en la posición posicion. Si se encuentra, devuelva la
rfind posición del primer carácter. Si no, devuelve un valor especial
(llamado string::npos ). El rfind hace lo mismo, pero devuelve la
posición de la ocurrencia de la última vez que aparece la cadena
especificada.

string str16 = "abcdefghi"; string str17 = "def";


string::size_type posicion = str16.find (str17,0);
cout << posicion << endl;
posicion = str16.find ("AB", 0);
if (posicion == string::npos)
cout << "no encontrado" << endl;

Programación II
Clase String
string substr(size_type pos, size_type n);

Devuelve una subcadena del string actual, comenzando en


substr la posición pos y teniendo una longitud de n :

string str18 = "abcdefghi";


str19 = str18.substr (6, 2);
cout << str19 << endl; //"gh"

Programación II
Clase String
Funciones No miembros:
Lee caracteres de un flujo de entradas en una string, parando
cuando sucede una de las cosas siguientes:
getline • Una condición end of file ocurre en el flujo de entradas
• Cuando el número máximo de los caracteres que pueden
caber en una string se ha leído.
• Cuando un carácter leído dentro de la cadena es igual al
delimitador especificado (el newline es el delimitador por
defecto); el carácter delimitador se quita del flujo de
entradas, pero no se añade a la cadena.
El valor de vuelta es una referencia al flujo de entradas. Si la
corriente se prueba como valor lógico (como en si o mientras
que), es equivalente verdad si se ha leído correctamente y
falso en otro caso (e.g., fin del archivo).

Programación II
Clase String
Funciones No miembros:
El operador de asignación se puede utilizar de
varias maneras:
• Asignando una cadena a otra
string cadena1= "hola";
= string cadena2; cadena2 = cadena1
• Asignando una cadena constante
string cadena3; cadena3 = "adiós";
• Asignando un carácter
string cadena4;
char ch = 'A';
cadena4 = ch;
cadena4 = 'Z';

Programación II
Clase String
Funciones No miembros:
+ es el operador de concatenación:
• dos objetos string
string str1 = "hola";
string str2 = "allí";
+ string str3 = str1 + str2; //"hola allí“

• un objeto string y una secuencia de caracteres


constante
string str1 = "hola";
string str4 = str1 + "allí";

• un objeto cadena y un único carácter


str5 = "el extremo"; string str6 = str5 + '!';

Programación II
Clase String
Funciones No miembros:
"+ =" el operador combina las operaciones anteriores de
asignación y de concatenación
+= secuencia str1 = "hola";
str1 + = "allí";
== Los operadores de comparación devuelven un valor
!= boleano (true/false) que indica si la relación especificada
<> se verifica entre los dos operandos. Los operandos pueden
<= ser:
>=
• dos objetos string
• un objeto string y una secuencia de caracteres
constante.

Programación II
Clase String
Funciones No miembros:
El operador de inserción envía el valor de un objeto string a un
flujo de salida (e.g., cout ).
<< secuencia str1 = "hola allí";
cout << str1 << endl;
>> El operador de extracción lee una cadena de caracteres de un
flujo de entrada y asigna el valor a un objeto string.
secuencia str1;
cin >> str1;
[] El operador del subíndice tiene acceso a un carácter en una
secuencia. Muy importante: No se pude utilizar para añadir
caracteres al string, sólo para consultar el valor de un carácter
o para modificarlo:
string str10 = "abcdefghi";
char ch = str10[3 ];
cout << ch << endl; // ' d '
str10[5] = ' X';
cout << str10 << endl; "abcdeXghi"

Programación II
Listas Enlazadas

Una lista enlazada consta de un número


indeterminado de elementos y cada
elemento tiene dos componentes
(campos), un puntero al siguiente elemento
de la lista y un valor, que puede ser de
cualquier tipo.

Programación II
Listas Enlazadas
Una lista enlazada consta de:
•Una colección de nodos situados en la
memoria dinámica conectados entre sí.
•Operaciones de inserción, eliminación y
consulta arbitrarias de elementos.
Cada nodo se compone de:
•Un dato.
•Una referencia al siguiente nodo.
class Nodo
{
object dato;
Nodo *Siguiente;
};
Programación II
Clasificación de las Listas Enlazadas
Las listas de se pueden dividir en cuatro
categorías:
oListas simplemente enlazadas: cada nodo (elemento)
contiene un único enlace que conecta ése al nodo
siguiente o sucesor. La lista es eficiente en recorridos
directos.
oLista doblemente enlazadas: cada nodo contiene dos
enlaces, uno a su predecesor y otro al su sucesor. La
lista es eficiente tanto en recorrido directo (<<adelante
>>) como en recorrido inverso (<<atrás>>).
oListas circulares simplemente enlazadas: una lista
simplemente enlazada en la que el último elemento (cola)
se enlaza al primer elemento (cabeza) de tal modo que la
lista puede ser recorrido de modo circular (<<en anillo>>)

Programación II
Clasificación de las Listas Enlazadas
Las listas de se pueden dividir en cuatro
categorías:
oListas circulares doblemente enlazadas: una lista
doblemente enlazada en la que el último elemento (cola)
se enlaza al primer elemento y viceversa. Esta lista se
puede recorrer en modo circular (en anillo) tanto en
dirección directa (<<adelante>>) como inversa
(<<atrás>>)

Programación II

Potrebbero piacerti anche