|
1 | 1 | # Smart Pointers y Heap Allocation
|
| 2 | + |
| 3 | +En Go, los desarrolladores rara vez se preocupan de donde se almacenan los |
| 4 | +datos en memoria. El lenguaje, junto al recolector de basura (Garbage Collector) |
| 5 | +se encarga automáticamente de decidir si una variable vive en el stack o en el |
| 6 | +heap, y se ocupa de liberarla cuando ya no es necesaria. Es un modelo cómodo. |
| 7 | + |
| 8 | +En Rust, en cambio, no tenemos Garbage collector como hemos explicado en el |
| 9 | +capitulo [Ownership y Borrowing] y en [Mentalidad y Filosofía]. |
| 10 | +Es por eso que en su lugar Rust ofrece estos mecanismos, [Ownership y Borrowing] |
| 11 | +que garantizan seguridad sin pausas de recolección. Esto también significa |
| 12 | +que en ciertas ocasiones, el programador debe decidir explicitamente si un valor |
| 13 | +debe almacenarse en el heap y que hacer con él. En este punto es donde entran en |
| 14 | +juego los `smart pointers`. |
| 15 | + |
| 16 | +## ¿Qué es un Smart Pointer? |
| 17 | + |
| 18 | +Un **smart pointer** en Rust es una estructura que se comporta como puntero, |
| 19 | +pero además encapsula lógica adicional. Es decir, no solo es una dirección de |
| 20 | +memoria, sino que posee comportamiento propio, un comportamiento asociado. |
| 21 | + |
| 22 | +Por ejemplo, puede gestionar la propiedad del valor al que apunta, contar |
| 23 | +cuántas referencias activas hay hacia él, o incluso permitir mutabilidad |
| 24 | +controlada en tiempo de ejecución. |
| 25 | + |
| 26 | +Algunos smart pointers comunes en Rust son: |
| 27 | +- `Box<T>` que sirve para almacenar valores en el `heap`, hablaremos más de esto |
| 28 | + en breve |
| 29 | +- `Rc<T>` para conteo de referencias en entornos `single thread` |
| 30 | +- `Arc<T>` para conteo de referencias en entornos `multi thread` |
| 31 | +- `RefCell<T>` para mutabilidad interior con verificación en tiempo de ejecución |
| 32 | + |
| 33 | +Vamos a concentrarnos en `Box` en este capitulo, ya que es el más simple y el |
| 34 | +más útil para introducir el concepto de `heap allocation` y `dynamic dispatch`. |
| 35 | + |
| 36 | +## ¿Qué es `Box<T>`? |
| 37 | + |
| 38 | +`Box<T>` es el smart pointer más básico en Rust. Su único uso es mover un valor |
| 39 | +al heap. |
| 40 | + |
| 41 | + |
| 42 | +[Ownership y Borrowing]: ./../fundamental/ownership-and-borrowing.md |
| 43 | +[Mentalidad y Filosofía]: ./../mindset.md |
0 commit comments