El 14 de septiembre de 2017, publicamos una versión revisada de nuestra Política de privacidad. Tu uso continuado de video2brain.com significa que aceptas este documento revisado, por lo que te recomendamos que dediques unos minutos a leerlo y comprenderlo.

C++: Librería de tratamiento de cadenas

La gestión de la memoria en BWString

Prueba ahora LinkedIn Learning sin cargo y sin compromiso.

Prueba gratis Mostrar modalidades de suscripción
Si la funcionalidad que queremos dar a la clase es importante, también lo es elegir las estructuras de datos y la estrategia de gestión de memoria que van a soportar esa funcionalidad. En este apartado veremos cómo hacerlo.
05:16

Transcripción

La clase BWString gestiona dos objetos de datos. Aquí tengo una copia de BWString extraída de los archivos de ejercicios. El string, como tal, se guarda en un string de C, por eso hay aquí un puntero a char, el string se asigna de forma dinámica, hay un parámetro de longitud separado que se guarda en un objeto de tipo size_t que registra la longitud del string, también hay un array que se utiliza para los resultados de una operación de división de string, y que se guarda en una raid uniq pointer de punteros compartidos, Aquí podemos ver que tenemos type_def para estos dos, de forma que sean más fáciles de usar. Habrás visto que el tipo split_ptr es un puntero único del tipo BWSP que es un puntero compartido de BWString, también puedes ver los corchetes, que hacen que esto sea un array. Tenemos un split array y un objeto size_t para guardar el contador. Además, hay dos objetos que están marcados como mutables y que nos permiten dividir un string con un método calificado como constante. Hablaremos sobre esto en un rato. Si vamos al archivo cpp, la memoria para el string se reserva en este método alloc_str que es muy sencillo. Si ya existe un string, hace una llamada a reset, lo que borra el string y reinicia el objeto BWString a su estado por defecto. Después utiliza la string lenght, este, de nuevo, es el objeto size_t en este objeto de aquí. Está justo aquí. Vamos a hacer eso un poco más grande. Después utiliza la longitud. Si esta longitud que se ha pasado es mayor que nuestro máximo, se le asigna a ese máximo. En caso contrario, le asigna el tamaño. Después reserva espacio en este string. String es el puntero en el que realmente guardamos nuestro string, reserva espacio ahí mediante new. Puedes ver que tenemos estos paréntesis después de la nueva asignación, que se rellenan con ceros. Solo se llama a Alloc string desde copy string, que está aquí abajo. A su vez, copy string siempre se utiliza para rellenar el string con datos. Algo que nunca se hace fuera de copy string. Esto hace que la gestión de datos para el buffer de string, sea sencilla y clara. Split array es un poco más complicado, pero no mucho. No quería utilizar un vector STL porque eso habría añadido todo el soporte de contenedores STL y le habría quitado mucho sentido a esta clase. Así que añadí este array cuando incorporé la funcionalidad Split string a la clase. En el futuro, probablemente sacaré todo el array a una clase diferente. Los strings que se almacenan en el proceso split string se almacenan en un array de punteros compartidos a objetos BWString, al array como tal, se accede a través de un puntero único. Estos type_def, definen estos tipos. Este es el puntero compartido, y este, el array de puntero único. Elegí el puntero único para el array por dos razones, primero, es importante que esta clase gestione realmente la memoria del array, esto me permite controlar la asignación de memoria para los objetos BWString separados. Segundo, el puntero único es la única clase de puntero inteligente que admite de forma nativa un array, esto me evita complicaciones a la hora de acceder a los elementos del array. La memoria para el array se gestiona en append_split_array. Estos métodos de aquí, repeat_split_array y reset_split_array, son privados. Si nos vamos a nuestro fichero cpp verás que append_split_array en realidad reserva el espacio para cada objeto, utiliza el puntero inteligente aquí, es un puntero compartido que es de tipo BWSP, después utiliza make shared para reservar realmente el espacio o para reservar el puntero compartido que se almacena en el split_array, después incrementa el contador. Reset_split_array, por su parte, pasa por todo el split array y para cada elemento de split_array hace una llamada a reset, y después una llamada a reset para todo el array. Es importante ver que no solo reiniciamos todo el array, sino que también cada uno de los elementos del array. Veremos la funcionalidad real de las funciones de división a lo largo de este curso, por ahora es importante entender que la elección de las estructuras de datos y el establecimiento de una estrategia de gestión de la memoria es una parte fundamental de la definición de una clase. En este caso lo he querido hacer lo más sencillo posible. Podría haber sido todavía más simple, dividiendo la gestión del array en una clase de vector separada, que es algo que me gustaría hacer en una futura versión de este proyecto.

C++: Librería de tratamiento de cadenas

Adapta tus proyectos en C++ para ofrecer la mejor gestión de recursos usando librerías personalizadas de tratamiento de cadenas, BWString, constructores, operadores, y muchos más.

37 min (9 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:15/12/2016

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.