13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 145 — #183<br />

✐<br />

4.1. Una librería pequeña al estilo C<br />

que preocuparnos por estas cosas. Pero, ¡ay!, la mayoría de los programadores no se<br />

preocuparán por descubrir lo que para nosotros es el «mejor» diseño para la librería.<br />

Probablem<strong>en</strong>te lo que harán es mirar d<strong>en</strong>tro de la estructura y obt<strong>en</strong>er el valor de<br />

next directam<strong>en</strong>te. Peor aún, podrían incluso cambiar el valor de next sin nuestro<br />

permiso. ¡Si hubiera alguna forma que permitiera al diseñador de la librería t<strong>en</strong>er un<br />

mejor control sobre este tipo de cosas! (Sí, esto es un presagio).<br />

4.1.1. Asignación dinámica de memoria<br />

Nunca se puede saber la cantidad máxima de almac<strong>en</strong>ami<strong>en</strong>to que se necesitará<br />

para una CStash, por eso la memoria a la que apuntan los elem<strong>en</strong>tos de storage se<br />

asigna desde el montículo (heap) 2 . El montículo es un gran bloque de memoria que<br />

se utiliza para asignar <strong>en</strong> pequeños trozos <strong>en</strong> tiempo de ejecución. Se usa el heap<br />

cuando no se conoce de antemano la cantidad de memoria que necesitará el programa<br />

que está escribi<strong>en</strong>do. Por ejemplo, eso ocurre <strong>en</strong> un programa <strong>en</strong> el que sólo <strong>en</strong><br />

el mom<strong>en</strong>to de la ejecución se sabe si se necesia memoria para 200 variables Avión<br />

o para 20. En C Estándar, las funciones para asignación dinámica de memoria incluy<strong>en</strong><br />

malloc(), calloc(), realloc() y free(). En lugar de llamadas a librerías,<br />

<strong>C++</strong> cu<strong>en</strong>ta con una técnica más sofisticada (y por lo tanto más fácil de usar) para<br />

tratar la memoria dinámica. Esta técnica está integrada <strong>en</strong> el l<strong>en</strong>guaje por medio de<br />

las palabras reservadas new y delete.<br />

La función inflate() usa new para obt<strong>en</strong>er más memoria para la CStash. En<br />

este caso el espacio de memoria sólo se amplia y nunca se reduce. assert() garantiza<br />

que no se pase un número negativo como argum<strong>en</strong>to a inflate() como valor<br />

de increm<strong>en</strong>to. La nueva cantidad de elm<strong>en</strong>tos que se podrán almac<strong>en</strong>ar (una vez<br />

se haya terminado inflate()) se determina <strong>en</strong> la variable newQuantity que se<br />

multiplica por el número de bytes que ocupa cada elem<strong>en</strong>to, para obt<strong>en</strong>er el nuevo<br />

número total de bytes de la asignación <strong>en</strong> la variable newBytes. Dado que se sabe<br />

cuántos bytes hay que copiar desde la ubicación anterior, oldBytes se calcula<br />

usando la cantidad antigua de bytes (quantity).<br />

La petición de memoria ocurre realm<strong>en</strong>te <strong>en</strong> la expresión-new que involucra la<br />

palabra reservada new:<br />

new unsigned char[newBytes];<br />

La forma g<strong>en</strong>eral de una expresión-new es:<br />

new Tipo;<br />

donde Tipo describe el tipo de variable para la cual se solicita memoria <strong>en</strong> el montículo.<br />

Dado que <strong>en</strong> este caso, se desea asignar memoria para un array de unsigned<br />

char de newBytes elem<strong>en</strong>tos, eso es lo que aparece como Tipo. Del mismo modo, se<br />

puede asignar memoria para algo más simple como un int con la expresión:<br />

new int;<br />

y aunque esto se utiliza muy poco, demuestra que la sintaxis es consist<strong>en</strong>te.<br />

Una expresión-new devuelve un puntero a un objeto del tipo exacto que se le pidió.<br />

2 N. de T.: heap se suele traducir al castellano como «montón» o «montículo».<br />

145<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!