Punter intel·ligent
Tipus | tipus abstracte de dades |
---|---|
Característiques tècniques | |
Plataforma | Biblioteca estàndard de C++ |
En informàtica, un punter intel·ligent és un tipus de dades abstracte que simula un punter alhora que ofereix funcions afegides, com ara la gestió automàtica de la memòria o la comprovació de límits. Aquestes característiques estan destinades a reduir els errors causats per l'ús indegut dels punters, tot mantenint l'eficiència. Els punters intel·ligents solen fer un seguiment de la memòria a la qual apunten i també es poden utilitzar per gestionar altres recursos, com ara connexions de xarxa i identificadors de fitxers. Els punters intel·ligents es van popularitzar per primera vegada en el llenguatge de programació C++ durant la primera meitat de la dècada de 1990 com a refutació de les crítiques a la manca de recollida automàtica d'escombraries de C++.[1]
El mal ús del punter pot ser una font important d'errors. Els punters intel·ligents eviten la majoria de situacions de fuites de memòria fent que la desassignació de memòria sigui automàtica. De manera més general, fan que la destrucció d'objectes sigui automàtica: un objecte controlat per un punter intel·ligent es destrueix automàticament (finalitzat i després desassignat) quan es destrueix l'últim (o únic) propietari d'un objecte, per exemple perquè el propietari és una variable local, i l'execució deixa l'abast de la variable. Els punters intel·ligents també eliminen els punters penjants posposant la destrucció fins que un objecte ja no s'utilitza.[2]
Si un llenguatge admet la recollida automàtica d'escombraries (per exemple, Java o C#), els punters intel·ligents no són necessaris per a la recuperació i els aspectes de seguretat de la gestió de la memòria, però són útils per a altres finalitats, com ara la gestió de residència de l'estructura de dades de la memòria cau i la gestió de recursos d'objectes com ara com a identificadors de fitxers o endolls de xarxa.[3]
Existeixen diversos tipus de punters intel·ligents. Alguns treballen amb el recompte de referències, d'altres assignant la propietat d'un objecte a un punter.[4]
Història
[modifica]Tot i que C++ va popularitzar el concepte de punters intel·ligents, especialment la varietat de referències comptades, el predecessor immediat d'un dels llenguatges que van inspirar el disseny de C++ tenia referències comptades per referències incorporades al llenguatge. C++ es va inspirar en part en Simula67. L'avantpassat de Simula67 era Simula I. En la mesura que l' element de Simula I és anàleg al punter de C++ sense null, i en la mesura que el procés de Simula I amb una declaració ficticia com a cos d'activitat és anàleg a l'estructura de C++ (que en si mateix és anàloga al registre de CAR Hoare en el treball contemporani dels anys 60). ), Simula Tenia elements comptats de referència (és a dir, expressions de punter que contenen indirectament) als processos (és a dir, registres) a tot tardar el setembre de 1965, tal com es mostra als paràgrafs citats a continuació.
Característiques
[modifica]En C++, un punter intel·ligent s'implementa com a classe de plantilla que imita, mitjançant la sobrecàrrega d'operadors, els comportaments d'un punter tradicional (en brut), (per exemple, desreferenciació, assignació) alhora que proporciona funcions addicionals de gestió de memòria.
Els punters intel·ligents poden facilitar la programació intencionada expressant, en el tipus, com es gestionarà la memòria del referent del punter. Per exemple, si una funció C++ retorna un punter, no hi ha manera de saber si la persona que truca ha d'esborrar la memòria del referent quan la persona que truca ha acabat amb la informació.
SomeType* AmbiguousFunction(); // What should be done with the result?
Tradicionalment, les convencions de nomenclatura s'han utilitzat per resoldre l'ambigüitat, que és un enfocament propens a errors i intensiu de mà d'obra. C++11 va introduir una manera de garantir una gestió correcta de la memòria en aquest cas declarant la funció per retornar un unique_ptr
,
std::unique_ptr<SomeType> ObviousFunction();
La declaració del tipus de retorn de la funció com a unique_ptr
fa explícit el fet que la persona que truca pren la propietat del resultat, i el temps d'execució de C++ assegura que la memòria es recuperarà automàticament. Abans de C++11, unique_ptr es pot substituir per auto_ptr, que ara està obsolet.
Referències
[modifica]- ↑ TylerMSFT. «Smart pointers (Modern C++)» (en anglès americà), 03-08-2021. [Consulta: 23 desembre 2023].
- ↑ «Smart Pointers in C++» (en anglès americà), 08-06-2014. [Consulta: 23 desembre 2023].
- ↑ «What is a smart pointer and when should I use one?» (en anglès). [Consulta: 23 desembre 2023].
- ↑ «smart pointers - cppreference.com» (en anglès). [Consulta: 23 desembre 2023].