Viedie rādītāji programmā C++
Priekšnosacījums: Norādes valodā C++
Rādītāji tiek izmantoti, lai piekļūtu resursiem, kas ir ārpus programmas, piemēram, kaudzes atmiņa. Tātad, lai piekļūtu kaudzes atmiņai (ja kaut kas ir izveidots kaudzes atmiņā), tiek izmantoti rādītāji. Piekļūstot jebkuram ārējam resursam, mēs izmantojam tikai resursa kopiju. Ja mēs tajā veicam kādas izmaiņas, mēs to mainām tikai kopētajā versijā. Bet, ja mēs izmantojam rādītāju uz resursu, mēs varēsim mainīt sākotnējo resursu.
Problēmas ar parastajiem rādītājiem
Dažas problēmas ar parastajiem rādītājiem programmā C++ ir šādas:
- Atmiņas noplūde: tas notiek, ja programma atkārtoti piešķir atmiņu, bet tā netiek atbrīvota. Tas izraisa pārmērīgu atmiņas patēriņu un galu galā izraisa sistēmas avāriju. Karājas norādes: Karājas rādītājs ir rādītājs, kas parādās brīdī, kad objekts tiek izņemts no atmiņas, nemainot rādītāja vērtību. Savvaļas norādes: Savvaļas norādes ir norādes, kuras tiek deklarētas un kurām tiek piešķirta atmiņa, taču rādītājs nekad netiek inicializēts, lai norādītu uz kādu derīgu objektu vai adresi. Datu nekonsekvence: datu nekonsekvence rodas, ja daži dati tiek saglabāti atmiņā, bet netiek konsekventi atjaunināti. Bufera pārpilde: kad rādītājs tiek izmantots, lai rakstītu datus uz atmiņas adresi, kas atrodas ārpus piešķirtā atmiņas bloka. Tas noved pie datu sabojāšanas, ko var izmantot ļaunprātīgi uzbrucēji.
Piemērs:
C++
// C++ program to demonstrate working of a Pointers> #include> using> namespace> std;> class> Rectangle {> private> :> > int> length;> > int> breadth;> };> void> fun()> {> > // By taking a pointer p and> > // dynamically creating object> > // of class rectangle> > Rectangle* p => new> Rectangle();> }> int> main()> {> > // Infinite Loop> > while> (1) {> > fun();> > }> }> |
Izvade
Memory limit exceeded
Paskaidrojums: Funkcijā jautri , tas izveido rādītāju, kas norāda uz Taisnstūris objektu. Objekts Taisnstūris satur divus veselus skaitļus, garums, un platums . Kad funkcija jautri beidzas, p tiks iznīcināts, jo tas ir lokāls mainīgais. Taču tā patērētā atmiņa netiks izdalīta, jo mēs aizmirsām to izmantot dzēst p; funkcijas beigās. Tas nozīmē, ka atmiņu nevarēs izmantot citi resursi. Bet mums vairs nav vajadzīgs mainīgais, mums ir vajadzīga atmiņa.
Funkcijā, galvenais , jautri tiek saukts bezgalīgā cilpā. Tas nozīmē, ka tas turpinās radīt lpp . Tas piešķirs arvien vairāk atmiņas, bet to neatbrīvos, jo mēs to nedabūjām. Iztērēto atmiņu nevar izmantot atkārtoti. Kas ir atmiņas noplūde. Visa kaudze šī iemesla dēļ atmiņa var kļūt bezjēdzīga.
Viedie rādītāji
Kā mēs zinām, neapzināti, ja rādītāja neatdalīšana izraisa atmiņas noplūdi, kas var izraisīt programmas avāriju. Valodas ir Java, C# Atkritumu savākšanas mehānismi lai gudri sadalītu neizmantoto atmiņu, lai to izmantotu vēlreiz. Programmētājam nav jāuztraucas par atmiņas noplūdēm. C++ nāk klajā ar savu mehānismu Viedais rādītājs . Kad objekts tiek iznīcināts, tas atbrīvo arī atmiņu. Tāpēc mums tas nav jādzēš, jo ar to tiks galā Smart Pointer.
A Viedais rādītājs ir iesaiņojuma klase virs rādītāja ar tādu operatoru kā * un -> pārslogots. Viedo rādītāju klases objekti izskatās kā parastie rādītāji. Bet, atšķirībā no Parastās norādes, tas var atdalīt un atbrīvot iznīcināto objektu atmiņu.
Ideja ir vadīt nodarbību ar rādītāju, iznīcinātājs, un pārslogoti operatori patīk * un -> . Tā kā iznīcinātājs tiek automātiski izsaukts, kad objekts ir ārpus darbības jomas, dinamiski piešķirtā atmiņa tiks automātiski dzēsta (vai atsauces skaitu var samazināt).
Piemērs:
C++
// C++ program to demonstrate the working of Smart Pointer> #include> using> namespace> std;> class> SmartPtr {> > int> * ptr;> // Actual pointer> public> :> > // Constructor: Refer> > // techcodeview.com for use of> > // explicit keyword> > explicit> SmartPtr(> int> * p = NULL) { ptr = p; }> > // Destructor> > ~SmartPtr() {> delete> (ptr); }> > // Overloading dereferencing operator> > int> & operator*() {> return> *ptr; }> };> int> main()> {> > SmartPtr ptr(> new> int> ());> > *ptr = 20;> > cout < < *ptr;> > // We don't need to call delete ptr: when the object> > // ptr goes out of scope, the destructor for it is> > // automatically called and destructor does delete ptr.> > return> 0;> }> |
Izvade
20
Atšķirība starp rādītājiem un viedajiem rādītājiem
| Rādītājs | Viedais rādītājs |
|---|---|
| Rādītājs ir mainīgais, kas uztur atmiņas adresi, kā arī datu tipa informāciju par šo atmiņas vietu. Rādītājs ir mainīgais, kas norāda uz kaut ko atmiņā. | Tas ir rādītāja iesaiņošanas steka piešķirts objekts. Viedās norādes, vienkāršā izteiksmē, ir klases, kas iesaiņo rādītāju, vai tvēruma norādes. |
| Tas netiek iznīcināts nekādā veidā, kad tas iziet ārpus tā darbības jomas | Tas iznīcina sevi, kad tas iziet ārpus tā darbības jomas |
| Rādītāji nav tik efektīvi, jo neatbalsta nevienu citu funkciju. | Viedie rādītāji ir efektīvāki, jo tiem ir papildu atmiņas pārvaldības funkcija. |
| Tie ir ļoti orientēti uz darbu / manuāli. | Tie ir automātiski/iepriekš ieprogrammēti pēc būtības. |
Piezīme: Tas darbojas tikai starpt . Tātad, mums būs jāizveido viedais rādītājs katram objektam? Nē , ir risinājums, Veidne . Zemāk esošajā kodā, kā redzat T var būt jebkura veida.
Piemērs:
C++
// C++ program to demonstrate the working of Template and> // overcome the issues which we are having with pointers> #include> using> namespace> std;> // A generic smart pointer class> template> <> class> T>>> |