Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐